diff options
author | Artur Signell <artur@vaadin.com> | 2016-05-25 21:37:56 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2016-05-27 10:03:17 +0000 |
commit | 5b18c5469e40529fad0d3d014ab4237a56616d81 (patch) | |
tree | 5c902dc100104040fee1bb198c2e49fbaee76102 /client | |
parent | c9f7f0f9e03d9aacea6062e3915f1687a72838b6 (diff) | |
download | vaadin-framework-5b18c5469e40529fad0d3d014ab4237a56616d81.tar.gz vaadin-framework-5b18c5469e40529fad0d3d014ab4237a56616d81.zip |
Send an ack message after push has removed connectors (#19822)
The server side needs to know the client has removed the connectors to
be able to do cleanup
Change-Id: Ic3d41cc5cbab035a53bf5c99496d74858c376e73
Diffstat (limited to 'client')
-rw-r--r-- | client/src/main/java/com/vaadin/client/communication/MessageHandler.java | 19 | ||||
-rw-r--r-- | client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java | 10 |
2 files changed, 22 insertions, 7 deletions
diff --git a/client/src/main/java/com/vaadin/client/communication/MessageHandler.java b/client/src/main/java/com/vaadin/client/communication/MessageHandler.java index 3ffadeb9ce..15e94ca8d9 100644 --- a/client/src/main/java/com/vaadin/client/communication/MessageHandler.java +++ b/client/src/main/java/com/vaadin/client/communication/MessageHandler.java @@ -493,8 +493,12 @@ public class MessageHandler { json.getValueMap("dd")); } - unregisterRemovedConnectors(connectorHierarchyUpdateResult.detachedConnectorIds); - + int removed = unregisterRemovedConnectors(connectorHierarchyUpdateResult.detachedConnectorIds); + if (removed > 0 && !isResponse(json)) { + // Must acknowledge the removal using an XHR or server + // memory usage will keep growing + getUIConnector().sendAck(); + } getLogger() .info("handleUIDLMessage: " + (Duration.currentTimeMillis() - processUidlStart) @@ -802,12 +806,13 @@ public class MessageHandler { Profiler.leave("verifyConnectorHierarchy - this is only performed in debug mode"); } - private void unregisterRemovedConnectors( + private int unregisterRemovedConnectors( FastStringSet detachedConnectors) { Profiler.enter("unregisterRemovedConnectors"); JsArrayString detachedArray = detachedConnectors.dump(); - for (int i = 0; i < detachedArray.length(); i++) { + int nrDetached = detachedArray.length(); + for (int i = 0; i < nrDetached; i++) { ServerConnector connector = getConnectorMap().getConnector( detachedArray.get(i)); @@ -822,10 +827,10 @@ public class MessageHandler { verifyConnectorHierarchy(); } - getLogger().info( - "* Unregistered " + detachedArray.length() - + " connectors"); + getLogger() + .info("* Unregistered " + nrDetached + " connectors"); Profiler.leave("unregisterRemovedConnectors"); + return nrDetached; } private JsArrayString createConnectorsIfNeeded(ValueMap json) { diff --git a/client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java b/client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java index 6f4872729d..ca9cb879af 100644 --- a/client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java +++ b/client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java @@ -1131,4 +1131,14 @@ public class UIConnector extends AbstractSingleComponentContainerConnector private static Logger getLogger() { return Logger.getLogger(UIConnector.class.getName()); } + + /** + * Send an acknowledgement RPC to the server. This allows the server to know + * which messages the client has received, even when the client is not + * sending any other traffic. + */ + public void sendAck() { + getRpcProxy(UIServerRpc.class).acknowledge(); + + } } |