This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch 
wicket-6944-make-application-listeners-static
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit f333ec0ff16e56756433ff66a4f5ddd12b1a984b
Author: Martin Tzvetanov Grigorov <mgrigo...@apache.org>
AuthorDate: Tue Mar 22 13:46:35 2022 +0200

    WICKET-6965 Memory leak in WicketEndpoint
    
    Make WicketEndpoint#REGISTERED_LISTENERS a static field.
    Unregister the listener at Application#onBeforeDestroyed()
    
    Signed-off-by: Martin Tzvetanov Grigorov <mgrigo...@apache.org>
---
 .../java/org/apache/wicket/protocol/ws/javax/WicketEndpoint.java   | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

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 40ba7d4..88df66a 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
@@ -46,13 +46,14 @@ public class WicketEndpoint extends Endpoint
 
        private static final Logger LOG = 
LoggerFactory.getLogger(WicketEndpoint.class);
 
+       private static final Set<String> REGISTERED_LISTENERS = 
ConcurrentHashMap.newKeySet();
+
        /**
         * The name of the request parameter that holds the application name
         */
        private static final String WICKET_APP_PARAM_NAME = "wicket-app-name";
 
        private final AtomicBoolean applicationDestroyed = new 
AtomicBoolean(false);
-       private final Set<String> registeredListeners = 
ConcurrentHashMap.newKeySet();
 
        private JavaxWebSocketProcessor javaxWebSocketProcessor;
 
@@ -62,7 +63,7 @@ public class WicketEndpoint extends Endpoint
                String appName = getApplicationName(session);
 
                WebApplication app = (WebApplication) 
WebApplication.get(appName);
-               if (registeredListeners.add(appName))
+               if (REGISTERED_LISTENERS.add(appName))
                {
                        app.getApplicationListeners().add(new 
ApplicationListener(applicationDestroyed));
                }
@@ -172,6 +173,8 @@ public class WicketEndpoint extends Endpoint
                public void onBeforeDestroyed(Application application)
                {
                        applicationDestroyed.set(true);
+                       REGISTERED_LISTENERS.remove(application.getName());
+                       application.getApplicationListeners().remove(this);
                }
        }
 }

Reply via email to