package net.sf.colossus.webserver; import java.util.Collection; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.colossus.webcommon.IWebClient; import net.sf.colossus.webcommon.User; import net.sf.colossus.webcommon.UserDB; /** * Sends ping requests to clients to check whether they are still alive * and connected. */ public class ClientWatchDog extends Thread { private static final Logger LOGGER = Logger.getLogger(ClientWatchDog.class .getName()); private boolean done; private final UserDB userDB; private static final long CHECK_INTERVAL_SECONDS = 30; public ClientWatchDog(UserDB userDB) { setName("ClientWatchDog"); this.userDB = userDB; done = false; } @Override public void run() { while (!done) { Collection<User> users = userDB.getLoggedInUsers(); int cnt = users.size(); if (cnt > 0) { // String names = User.getLoggedInNamesAsString(", "); // LOGGER.finest(cnt + " users logged in (" + names // + "), checking them..."); for (User u : users) { IWebClient client = u.getWebserverClient(); if (client != null) { long now = new Date().getTime(); ((WebServerClient)client).requestPingIfNeeded(now); // client.checkMaxIdleTime(now); } } } else { // LOGGER // .finest("No users logged in, nothing to do for watchdog"); } sleepFor(CHECK_INTERVAL_SECONDS * 1000); } LOGGER.info("Done flag set, watchdog ends now..."); } public void sleepFor(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { if (done) { LOGGER.log(Level.FINEST, "InterruptException caught and done is set - all right!"); } else { LOGGER.log(Level.WARNING, "InterruptException caught... ignoring it..."); } } } public void shutdown() { done = true; this.interrupt(); } }