@@ -290,6 +290,10 @@ public class ApplicationConfiguration implements EntryPoint { | |||
return rootId; | |||
} | |||
/** | |||
* @return The interval in seconds between heartbeat requests, or a | |||
* non-positive number if heartbeat is disabled. | |||
*/ | |||
public int getHeartbeatInterval() { | |||
return heartbeatInterval; | |||
} |
@@ -2524,19 +2524,23 @@ public class ApplicationConnection { | |||
} | |||
/** | |||
* Schedules a heartbeat request. | |||
* Schedules a heartbeat request to occur after the configured heartbeat | |||
* interval elapses if the interval is a positive number. Otherwise, does | |||
* nothing. | |||
* | |||
* @see #sendHeartbeat() | |||
* @see ApplicationConfiguration#getHeartbeatInterval() | |||
*/ | |||
private void scheduleHeartbeat() { | |||
final int interval = 1000 * getConfiguration().getHeartbeatInterval(); | |||
protected void scheduleHeartbeat() { | |||
final int interval = getConfiguration().getHeartbeatInterval(); | |||
if (interval > 0) { | |||
VConsole.log("Scheduling heartbeat in " + interval + " seconds"); | |||
new Timer() { | |||
@Override | |||
public void run() { | |||
sendHeartbeat(); | |||
} | |||
}.schedule(interval); | |||
}.schedule(interval * 1000); | |||
} | |||
} | |||
@@ -2552,7 +2556,7 @@ public class ApplicationConnection { | |||
* @see #scheduleHeartbeat() | |||
* @see com.vaadin.ui.Root#heartbeat() | |||
*/ | |||
private void sendHeartbeat() { | |||
protected void sendHeartbeat() { | |||
final String uri = addGetParameters( | |||
translateVaadinUri(ApplicationConstants.APP_PROTOCOL_PREFIX | |||
+ ApplicationConstants.HEARTBEAT_REQUEST_PATH), | |||
@@ -2568,6 +2572,7 @@ public class ApplicationConnection { | |||
int status = response.getStatusCode(); | |||
if (status == Response.SC_OK) { | |||
// TODO Permit retry in some error situations | |||
VConsole.log("Heartbeat response OK"); | |||
scheduleHeartbeat(); | |||
} else { | |||
VConsole.error("Heartbeat request failed with status code " | |||
@@ -2585,6 +2590,7 @@ public class ApplicationConnection { | |||
rb.setCallback(callback); | |||
try { | |||
VConsole.log("Sending heartbeat request..."); | |||
rb.send(); | |||
} catch (RequestException re) { | |||
callback.onError(null, re); |
@@ -2448,7 +2448,9 @@ public class Application implements Terminal.ErrorListener, Serializable { | |||
/** | |||
* Removes all those roots from the application whose last heartbeat | |||
* occurred more than {@link #getHeartbeatTimeout()} seconds ago. Close | |||
* events are fired for the removed roots. | |||
* events are fired for the removed roots. If | |||
* <code>getHeartbeatTimeout()</code> returns a nonpositive number, no | |||
* cleanup is performed. | |||
* <p> | |||
* Called by the framework at the end of every request. | |||
* | |||
@@ -2459,13 +2461,15 @@ public class Application implements Terminal.ErrorListener, Serializable { | |||
* @since 7.0.0 | |||
*/ | |||
public void closeInactiveRoots() { | |||
long now = System.currentTimeMillis(); | |||
for (Iterator<Root> i = roots.values().iterator(); i.hasNext();) { | |||
Root root = i.next(); | |||
if (now - root.getLastHeartbeat() > 1000 * getHeartbeatTimeout()) { | |||
i.remove(); | |||
retainOnRefreshRoots.values().remove(root.getRootId()); | |||
root.fireCloseEvent(); | |||
if (getHeartbeatTimeout() > 0) { | |||
long now = System.currentTimeMillis(); | |||
for (Iterator<Root> i = roots.values().iterator(); i.hasNext();) { | |||
Root root = i.next(); | |||
if (now - root.getLastHeartbeat() > 1000 * getHeartbeatTimeout()) { | |||
i.remove(); | |||
retainOnRefreshRoots.values().remove(root.getRootId()); | |||
root.fireCloseEvent(); | |||
} | |||
} | |||
} | |||
} | |||
@@ -2478,7 +2482,8 @@ public class Application implements Terminal.ErrorListener, Serializable { | |||
* | |||
* @since 7.0.0 | |||
* | |||
* @return The heartbeat timeout in seconds. | |||
* @return The heartbeat timeout in seconds or a nonpositive number if | |||
* timeout never occurs. | |||
*/ | |||
public int getHeartbeatTimeout() { | |||
// Permit three missed heartbeats before closing the root |
@@ -155,7 +155,8 @@ public interface DeploymentConfiguration extends Serializable { | |||
public int getResourceCacheTime(); | |||
/** | |||
* Returns the number of seconds between heartbeat requests of a root. | |||
* Returns the number of seconds between heartbeat requests of a root, or a | |||
* non-negative number if heartbeat is disabled. | |||
* | |||
* @return | |||
*/ |
@@ -228,11 +228,11 @@ public abstract class AbstractDeploymentConfiguration implements | |||
try { | |||
heartbeatInterval = Integer | |||
.parseInt(getApplicationOrSystemProperty( | |||
Constants.SERVLET_PARAMETER_HEARTBEAT_RATE, "500")); | |||
Constants.SERVLET_PARAMETER_HEARTBEAT_RATE, "300")); | |||
} catch (NumberFormatException e) { | |||
getLogger().warning( | |||
Constants.WARNING_HEARTBEAT_INTERVAL_NOT_NUMERIC); | |||
heartbeatInterval = 500; | |||
heartbeatInterval = 300; | |||
} | |||
} | |||