diff --git a/src/org/apollo/game/GamePulseHandler.java b/src/org/apollo/game/GamePulseHandler.java index aeb24582..5c5a5144 100644 --- a/src/org/apollo/game/GamePulseHandler.java +++ b/src/org/apollo/game/GamePulseHandler.java @@ -25,7 +25,7 @@ public final class GamePulseHandler implements Runnable { * * @param service The {@link GameService}. */ - GamePulseHandler(GameService service) { + protected GamePulseHandler(GameService service) { this.service = service; } @@ -33,10 +33,11 @@ public final class GamePulseHandler implements Runnable { public void run() { try { service.pulse(); - } catch (Throwable t) { - logger.log(Level.SEVERE, "Exception during pulse.", t); + } catch (Throwable reason) { + logger.log(Level.SEVERE, "Exception occured during pulse!", reason); + } finally { + service.shutdown(false); } - } } \ No newline at end of file diff --git a/src/org/apollo/game/GameService.java b/src/org/apollo/game/GameService.java index 388489d4..69aa7da9 100644 --- a/src/org/apollo/game/GameService.java +++ b/src/org/apollo/game/GameService.java @@ -125,18 +125,11 @@ public final class GameService extends Service { */ public void pulse() { synchronized (this) { - LoginService loginService = getContext().getService(LoginService.class); + finalizeUnregisters(); + World world = World.getWorld(); - - int unregistered = 0; - Player old; - while (unregistered < UNREGISTERS_PER_CYCLE && (old = oldPlayers.poll()) != null) { - loginService.submitSaveRequest(old.getSession(), old); - unregistered++; - } - - for (Player p : world.getPlayerRepository()) { - GameSession session = p.getSession(); + for (Player player : world.getPlayerRepository()) { + GameSession session = player.getSession(); if (session != null) { session.handlePendingMessages(chainGroup); } @@ -147,6 +140,30 @@ public final class GameService extends Service { } } + /** + * Finalizes the unregistration of Player's queued to be unregistered. + */ + private void finalizeUnregisters() { + LoginService loginService = getContext().getService(LoginService.class); + + for (int count = 0; count < UNREGISTERS_PER_CYCLE; count++) { + Player player = oldPlayers.poll(); + if (player == null) { + break; + } + + loginService.submitSaveRequest(player.getSession(), player); + } + } + + /** + * Shuts down this game service. + */ + public void shutdown(boolean natural) { + scheduledExecutor.shutdownNow(); + // TODO: Other events that should happen upon natural or unexpected shutdown. + } + /** * Registers a {@link Player} (may block!). * @@ -170,9 +187,6 @@ public final class GameService extends Service { } } - /** - * Starts the game service. - */ @Override public void start() { scheduledExecutor.scheduleAtFixedRate(new GamePulseHandler(this), GameConstants.PULSE_DELAY, GameConstants.PULSE_DELAY, TimeUnit.MILLISECONDS);