From ca8e484fbda8c78311a4ebf68d0bf97eda1be4ad Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Mon, 20 Apr 2015 20:34:05 +0300 Subject: [PATCH] Handle heartbeat problems in CommunicationProblemHandler (#11733) Change-Id: I5af55ecac8f5dcac14fd5b22059029bef482cc7f --- .../CommunicationProblemHandler.java | 53 +++++++++++++++++++ .../client/communication/Heartbeat.java | 35 +++++------- 2 files changed, 66 insertions(+), 22 deletions(-) diff --git a/client/src/com/vaadin/client/communication/CommunicationProblemHandler.java b/client/src/com/vaadin/client/communication/CommunicationProblemHandler.java index d8740a50e6..9c580fb6d9 100644 --- a/client/src/com/vaadin/client/communication/CommunicationProblemHandler.java +++ b/client/src/com/vaadin/client/communication/CommunicationProblemHandler.java @@ -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; + } } diff --git a/client/src/com/vaadin/client/communication/Heartbeat.java b/client/src/com/vaadin/client/communication/Heartbeat.java index bd26f46637..c8353f3215 100644 --- a/client/src/com/vaadin/client/communication/Heartbeat.java +++ b/client/src/com/vaadin/client/communication/Heartbeat.java @@ -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(); + } } }; -- 2.39.5