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

@ -37,6 +37,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
@ -69,6 +72,7 @@ import mage.view.TournamentView;
public class Session {
private final static Logger logger = Logging.getLogger(Session.class.getName());
private static ScheduledExecutorService sessionExecutor = Executors.newScheduledThreadPool(1);
private UUID sessionId;
private Server server;
@ -112,6 +116,7 @@ public class Session {
sessionId = server.registerClient(userName, client.getId(), frame.getVersion());
callbackDaemon = new CallbackClientDaemon(sessionId, client, server);
serverState = server.getServerState();
sessionExecutor.scheduleWithFixedDelay(new ServerPinger(), 15, 5, TimeUnit.SECONDS);
logger.info("Connected to RMI server at " + serverName + ":" + port);
frame.setStatusText("Connected to " + serverName + ":" + port + " ");
frame.enableButtons();
@ -134,7 +139,6 @@ public class Session {
if (isConnected()) {
try {
frame.hideTables();
for (UUID chatId: chats.keySet()) {
server.leaveChat(chatId, sessionId);
}
@ -145,18 +149,25 @@ public class Session {
try {
//TODO: stop daemon
server.deregisterClient(sessionId);
server = null;
logger.info("Disconnected ... ");
} catch (RemoteException ex) {
logger.log(Level.SEVERE, "Error disconnecting ...", ex);
} catch (MageException ex) {
logger.log(Level.SEVERE, "Error disconnecting ...", ex);
}
frame.setStatusText("Not connected ");
frame.disableButtons();
removeServer();
}
}
private void removeServer() {
sessionExecutor.shutdownNow();
server = null;
frame.hideTables();
frame.setStatusText("Not connected");
frame.disableButtons();
logger.info("Disconnected ... ");
JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Disconnected.", "Disconnected", JOptionPane.INFORMATION_MESSAGE);
}
public void ack(String message) {
try {
server.ack(message, sessionId);
@ -167,6 +178,17 @@ public class Session {
}
}
public boolean ping() {
try {
return server.ping(sessionId);
} catch (RemoteException ex) {
handleRemoteException(ex);
} catch (MageException ex) {
handleMageException(ex);
}
return false;
}
public boolean isConnected() {
return server != null;
}
@ -706,14 +728,7 @@ public class Session {
private void handleRemoteException(RemoteException ex) {
logger.log(Level.SEVERE, "Communication error", ex);
if (ex instanceof java.rmi.ConnectException) {
server = null;
frame.setStatusText("Not connected");
frame.disableButtons();
JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Communication error - disconnecting.", "Error", JOptionPane.ERROR_MESSAGE);
}
else
JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Communication error.", "Error", JOptionPane.ERROR_MESSAGE);
removeServer();
}
private void handleMageException(MageException ex) {
@ -741,4 +756,24 @@ public class Session {
return server;
}
}
class ServerPinger implements Runnable {
private int missed = 0;
@Override
public void run() {
if (!ping()) {
missed++;
if (missed > 10) {
logger.info("Connection to server timed out");
removeServer();
}
}
else {
missed = 0;
}
}
}
}

View file

@ -190,10 +190,11 @@ public class TablesPanel extends javax.swing.JPanel {
}
public void hideTables() {
if (tableWaitingDialog.isVisible()) {
if (tableWaitingDialog != null && tableWaitingDialog.isVisible()) {
tableWaitingDialog.closeDialog();
}
updateTask.cancel(true);
if (updateTask != null)
updateTask.cancel(true);
this.chatPanel.disconnect();
Component c = this.getParent();