added client/server ping + remove inactive connections from server

This commit is contained in:
BetaSteward 2011-05-11 22:08:11 -04:00
parent 774d56dd6b
commit ab599dd335
7 changed files with 105 additions and 20 deletions

View file

@ -70,7 +70,7 @@ public class ChatManager {
chatSessions.get(chatId).broadcast(userName, message, color);
}
void removeSession(UUID sessionId) {
public void removeSession(UUID sessionId) {
for (ChatSession chat: chatSessions.values()) {
chat.kill(sessionId);
}

View file

@ -45,6 +45,7 @@ import mage.game.tournament.TournamentOptions;
import mage.interfaces.Server;
import mage.interfaces.ServerState;
import mage.interfaces.callback.ClientCallback;
import mage.server.Session;
import mage.server.game.DeckValidatorFactory;
import mage.server.draft.DraftManager;
import mage.server.game.GameFactory;
@ -105,6 +106,16 @@ public class ServerImpl extends RemoteServer implements Server {
SessionManager.getInstance().getSession(sessionId).ack(message);
}
@Override
public boolean ping(UUID sessionId) {
Session session = SessionManager.getInstance().getSession(sessionId);
if (session != null) {
session.ping();
return true;
}
return false;
}
@Override
public UUID registerClient(String userName, UUID clientId, MageVersion version) throws MageException, RemoteException {
@ -241,8 +252,8 @@ public class ServerImpl extends RemoteServer implements Server {
Session session = SessionManager.getInstance().getSession(sessionId);
if (session != null) {
session.kill();
logger.info("Client deregistered ...");
}
logger.info("Client deregistered ...");
}
}
);

View file

@ -28,6 +28,7 @@
package mage.server;
import java.util.Date;
import java.util.logging.Level;
import java.util.UUID;
import mage.cards.decks.Deck;
@ -50,6 +51,7 @@ public class Session {
private String username;
private int messageId = 0;
private String ackMessage;
private long lastPing;
private final CallbackServerSession callback = new CallbackServerSession();
public Session(String userName, UUID clientId) {
@ -137,4 +139,12 @@ public class Session {
return username;
}
public void ping() {
this.lastPing = System.currentTimeMillis();
}
public boolean stillAlive() {
return (System.currentTimeMillis() - lastPing) < 60000;
}
}

View file

@ -30,6 +30,9 @@ package mage.server;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import mage.interfaces.MageException;
import org.apache.log4j.Logger;
@ -41,15 +44,20 @@ public class SessionManager {
private final static Logger logger = Logger.getLogger(SessionManager.class);
private final static SessionManager INSTANCE = new SessionManager();
private static ScheduledExecutorService sessionExecutor;
public static SessionManager getInstance() {
return INSTANCE;
}
protected SessionManager() {
sessionExecutor = Executors.newScheduledThreadPool(1);
sessionExecutor.scheduleWithFixedDelay(new SessionChecker(), 30, 10, TimeUnit.SECONDS);
}
private ConcurrentHashMap<UUID, Session> sessions = new ConcurrentHashMap<UUID, Session>();
public Session getSession(UUID sessionId) {
if (sessions == null || sessionId == null) return null;
return sessions.get(sessionId);
}
@ -74,5 +82,24 @@ public class SessionManager {
public void removeSession(UUID sessionId) {
sessions.remove(sessionId);
}
public void checkSessions() {
for (Session session: sessions.values()) {
if (!session.stillAlive()) {
logger.info("Client for user " + session.getUsername() + " timed out - releasing resources");
session.kill();
sessions.remove(session.getId());
}
}
}
class SessionChecker implements Runnable {
@Override
public void run() {
checkSessions();
}
}
}