summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorArtur Signell <artur@vaadin.com>2016-05-25 21:37:56 +0300
committerVaadin Code Review <review@vaadin.com>2016-05-27 10:03:17 +0000
commit5b18c5469e40529fad0d3d014ab4237a56616d81 (patch)
tree5c902dc100104040fee1bb198c2e49fbaee76102 /client
parentc9f7f0f9e03d9aacea6062e3915f1687a72838b6 (diff)
downloadvaadin-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.java19
-rw-r--r--client/src/main/java/com/vaadin/client/ui/ui/UIConnector.java10
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();
+
+ }
}