This is an automated email from the ASF dual-hosted git repository.
mgrigorov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git
The following commit(s) were added to refs/heads/master by this push:
new 0b2caa8 WICKET-6692 Page deserialization on websocket close -
possible performance issue
0b2caa8 is described below
commit 0b2caa8dfae6cde4e521b708c676e6611ec99b34
Author: Martin Tzvetanov Grigorov <[email protected]>
AuthorDate: Wed Aug 14 15:15:09 2019 +0300
WICKET-6692 Page deserialization on websocket close - possible performance
issue
Introduce WebSocketSettings#setNotifyOnCloseEvent(Function<Integer,
Boolean>) that can be used to decide whether to call #broadcastMessage() for
close events.
(cherry picked from commit 4425c508d105481da85bbfc8dbee4bf88f62caa4)
---
.../apache/wicket/protocol/ws/WebSocketSettings.java | 18 +++++++++++++++++-
.../protocol/ws/api/AbstractWebSocketProcessor.java | 4 +++-
.../wicket/protocol/ws/javax/WicketEndpoint.java | 8 +++++++-
3 files changed, 27 insertions(+), 3 deletions(-)
diff --git
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
index 0a30d01..d6967a6 100644
---
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
+++
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java
@@ -41,6 +41,7 @@ import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Function;
/**
* Web Socket related settings.
@@ -49,7 +50,6 @@ import java.util.concurrent.atomic.AtomicReference;
*/
public class WebSocketSettings
{
-
private static final Logger LOG =
LoggerFactory.getLogger(WebSocketSettings.class);
private static final MetaDataKey<WebSocketSettings> KEY = new
MetaDataKey<>()
@@ -133,6 +133,22 @@ public class WebSocketSettings
private IWebSocketConnectionFilter connectionFilter;
/**
+ * A function that decides whether to notify the page/resource on
+ * web socket connection closed event.
+ * The page notification leads to deserialization of the page instance
from
+ * the page store and sometimes this is not wanted.
+ */
+ private Function<Integer, Boolean> notifyOnCloseEvent = (code) -> true;
+
+ public boolean shouldNotifyOnCloseEvent(int closeCode) {
+ return notifyOnCloseEvent == null ||
notifyOnCloseEvent.apply(closeCode);
+ }
+
+ public void setNotifyOnCloseEvent(Function<Integer, Boolean>
notifyOnCloseEvent) {
+ this.notifyOnCloseEvent = notifyOnCloseEvent;
+ }
+
+ /**
* Set the executor for processing websocket push messages broadcasted
to all sessions.
* Default executor does all the processing in the caller thread. Using
a proper thread pool is adviced
* for applications that send push events from ajax calls to avoid page
level deadlocks.
diff --git
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
index 1a86128..2505278 100644
---
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
+++
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
@@ -185,7 +185,9 @@ public abstract class AbstractWebSocketProcessor implements
IWebSocketProcessor
public void onClose(int closeCode, String message)
{
IKey key = getRegistryKey();
- broadcastMessage(new ClosedMessage(getApplication(),
getSessionId(), key, closeCode, message));
+ if (webSocketSettings.shouldNotifyOnCloseEvent(closeCode)) {
+ broadcastMessage(new ClosedMessage(getApplication(),
getSessionId(), key, closeCode, message));
+ }
connectionRegistry.removeConnection(getApplication(),
getSessionId(), key);
}
diff --git
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java
index 3447617..e93cf86 100644
---
a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java
+++
b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java
@@ -74,9 +74,15 @@ public class WicketEndpoint extends Endpoint
{
super.onClose(session, closeReason);
+ final int closeCode = closeReason.getCloseCode().getCode();
+ final String reasonPhrase = closeReason.getReasonPhrase();
+
+ LOG.debug("Web Socket connection with id '{}' has been closed
with code '{}' and reason: {}",
+ session.getId(), closeCode, reasonPhrase);
+
if (isApplicationAlive())
{
-
javaxWebSocketProcessor.onClose(closeReason.getCloseCode().getCode(),
closeReason.getReasonPhrase());
+ javaxWebSocketProcessor.onClose(closeCode,
reasonPhrase);
}
}