]> source.dussan.org Git - vaadin-framework.git/commitdiff
Handle heartbeat problems in CommunicationProblemHandler (#11733)
authorArtur Signell <artur@vaadin.com>
Mon, 20 Apr 2015 17:34:05 +0000 (20:34 +0300)
committerArtur Signell <artur@vaadin.com>
Mon, 13 Jul 2015 14:19:08 +0000 (17:19 +0300)
Change-Id: I5af55ecac8f5dcac14fd5b22059029bef482cc7f

client/src/com/vaadin/client/communication/CommunicationProblemHandler.java
client/src/com/vaadin/client/communication/Heartbeat.java

index d8740a50e63785318d06bb6ea9b6b361ce3429df..9c580fb6d9c989a9ee4bbda9d6894238a3f0b94b 100644 (file)
@@ -17,6 +17,7 @@ package com.vaadin.client.communication;
 
 import java.util.logging.Logger;
 
+import com.google.gwt.http.client.Request;
 import com.google.gwt.http.client.Response;
 import com.google.gwt.regexp.shared.MatchResult;
 import com.google.gwt.regexp.shared.RegExp;
@@ -224,4 +225,56 @@ public class CommunicationProblemHandler {
     private ServerCommunicationHandler getServerCommunicationHandler() {
         return connection.getServerCommunicationHandler();
     }
+
+    /**
+     * Called when a heartbeat request returns a status code other than 200
+     * 
+     * @param request
+     *            The heartbeat request
+     * @param response
+     *            The heartbeat response
+     * @return true if a new heartbeat should be sent, false if no further
+     *         heartbeats should be sent
+     */
+    public boolean heartbeatInvalidStatusCode(Request request, Response response) {
+        int status = response.getStatusCode();
+        int interval = connection.getHeartbeat().getInterval();
+        if (status == 0) {
+            getLogger().warning(
+                    "Failed sending heartbeat, server is unreachable, retrying in "
+                            + interval + "secs.");
+        } else if (status == Response.SC_GONE) {
+            // FIXME Stop application?
+            connection.showSessionExpiredError(null);
+            // If session is expired break the loop
+            return false;
+        } else if (status >= 500) {
+            getLogger().warning(
+                    "Failed sending heartbeat, see server logs, retrying in "
+                            + interval + "secs.");
+        } else {
+            getLogger()
+                    .warning(
+                            "Failed sending heartbeat to server. Error code: "
+                                    + status);
+        }
+
+        return true;
+    }
+
+    /**
+     * Called when an exception occurs during a heartbeat request
+     * 
+     * @param request
+     *            The heartbeat request
+     * @param exception
+     *            The exception which occurred
+     * @return true if a new heartbeat should be sent, false if no further
+     *         heartbeats should be sent
+     */
+    public boolean heartbeatException(Request request, Throwable exception) {
+        getLogger().severe(
+                "Exception sending heartbeat: " + exception.getMessage());
+        return true;
+    }
 }
index bd26f46637f12817f2ae69f832418f5b77a4f8b9..c8353f32158832ec52adcdb5664d0649279fd31b 100644 (file)
@@ -95,37 +95,28 @@ public class Heartbeat {
             public void onResponseReceived(Request request, Response response) {
                 int status = response.getStatusCode();
 
+                boolean reschedule = true;
                 if (status == Response.SC_OK) {
                     getLogger().fine("Heartbeat response OK");
-                } else if (status == 0) {
-                    getLogger().warning(
-                            "Failed sending heartbeat, server is unreachable, retrying in "
-                                    + interval + "secs.");
-                } else if (status >= 500) {
-                    getLogger().warning(
-                            "Failed sending heartbeat, see server logs, retrying in "
-                                    + interval + "secs.");
-                } else if (status == Response.SC_GONE) {
-                    connection.showSessionExpiredError(null);
-                    // If session is expired break the loop
-                    return;
                 } else {
-                    getLogger().warning(
-                            "Failed sending heartbeat to server. Error code: "
-                                    + status);
+                    reschedule = connection.getCommunicationProblemHandler()
+                            .heartbeatInvalidStatusCode(request, response);
                 }
 
-                // Don't break the loop
-                schedule();
+                if (reschedule) {
+                    schedule();
+                }
             }
 
             @Override
             public void onError(Request request, Throwable exception) {
-                getLogger().severe(
-                        "Exception sending heartbeat: "
-                                + exception.getMessage());
-                // Don't break the loop
-                schedule();
+                boolean reschedule = connection
+                        .getCommunicationProblemHandler().heartbeatException(
+                                request, exception);
+
+                if (reschedule) {
+                    schedule();
+                }
             }
         };