diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index f2be8391f95..32d87684e7a 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -1231,12 +1231,14 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { @Override public void disconnected(final boolean errorCall) { - if (SwingUtilities.isEventDispatchThread()) { + if (SwingUtilities.isEventDispatchThread()) { // Returns true if the current thread is an AWT event dispatching thread. + logger.info("DISCONNECTED (Event Dispacth Thread)"); setStatusText("Not connected"); disableButtons(); hideGames(); hideTables(); } else { + logger.info("DISCONNECTED (NO Event Dispacth Thread)"); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { diff --git a/Mage.Common/src/mage/remote/SessionImpl.java b/Mage.Common/src/mage/remote/SessionImpl.java index bc2e1c5c90c..0bcace8817d 100644 --- a/Mage.Common/src/mage/remote/SessionImpl.java +++ b/Mage.Common/src/mage/remote/SessionImpl.java @@ -43,6 +43,7 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; +import javax.swing.SwingUtilities; import mage.MageException; import mage.cards.decks.DeckCardLists; import mage.cards.decks.InvalidDeckException; @@ -364,14 +365,20 @@ public class SessionImpl implements Session { } } + /** + * + * @param errorCall - was connection lost because of error + */ @Override public synchronized void disconnect(boolean errorCall) { if (isConnected()) { + logger.info("DISCONNECT still connected"); sessionState = SessionState.DISCONNECTING; } if (connection == null || sessionState == SessionState.DISCONNECTED) { return; } + try { callbackClient.removeListener(callbackHandler); callbackClient.disconnect(); @@ -379,17 +386,24 @@ public class SessionImpl implements Session { } catch (Throwable ex) { logger.fatal("Error disconnecting ...", ex); } + if (sessionState == SessionState.DISCONNECTING || sessionState == SessionState.CONNECTING) { sessionState = SessionState.DISCONNECTED; logger.info("Disconnected ... "); - client.disconnected(errorCall); if (errorCall) { client.showError("Network error. You have been disconnected"); } + client.disconnected(errorCall); // MageFrame with check to reconnect pingTime.clear(); } } + @Override + public synchronized void reconnect(Throwable throwable) { + logger.info("RECONNECT - Connected: " + isConnected()); + client.disconnected(true); + } + @Override public synchronized boolean sendFeedback(String title, String type, String message, String email) { if (isConnected()) { @@ -412,12 +426,14 @@ public class SessionImpl implements Session { } class ClientConnectionListener implements ConnectionListener { + // http://docs.jboss.org/jbossremoting/2.5.3.SP1/html/chapter-connection-failure.html + @Override public void handleConnectionException(Throwable throwable, Client client) { logger.info("connection to server lost - " + throwable.getMessage()); throwable.printStackTrace(); - // that's maybe not correct to disconnect here. - // disconnect(true); + + reconnect(throwable); } } diff --git a/Mage.Common/src/mage/remote/interfaces/Connect.java b/Mage.Common/src/mage/remote/interfaces/Connect.java index da4346a16b9..948fc228d11 100644 --- a/Mage.Common/src/mage/remote/interfaces/Connect.java +++ b/Mage.Common/src/mage/remote/interfaces/Connect.java @@ -42,6 +42,8 @@ public interface Connect { void disconnect(boolean showMessage); + void reconnect(Throwable throwable); + boolean ping(); boolean isConnected();