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);
                }
        }
 

Reply via email to