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

markt pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/10.1.x by this push:
     new 3cb29d58e2 Improve handling of multiple disconnects
3cb29d58e2 is described below

commit 3cb29d58e25862208700dc3aa05d716c7c0d5f69
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed May 1 17:20:07 2024 +0100

    Improve handling of multiple disconnects
---
 webapps/docs/changelog.xml                                       | 4 ++++
 webapps/examples/WEB-INF/classes/websocket/snake/Snake.java      | 3 +--
 .../WEB-INF/classes/websocket/snake/SnakeAnnotation.java         | 9 +++++----
 webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java | 5 ++---
 4 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 3e6114bda0..ecd5c7e36b 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -195,6 +195,10 @@
         Examples: Increase the number of previous messages displayed when using
         the WebSocket chat application. (markt)
       </update>
+      <fix>
+        Examples: Improve performance of WebSocket snake application when
+        multiple clients disconnect at the same time. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Other">
diff --git a/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java 
b/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java
index 619a879c80..5936bf4303 100644
--- a/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java
+++ b/webapps/examples/WEB-INF/classes/websocket/snake/Snake.java
@@ -67,8 +67,7 @@ public class Snake {
         try {
             session.getBasicRemote().sendText(msg);
         } catch (IOException ioe) {
-            CloseReason cr =
-                    new CloseReason(CloseCodes.CLOSED_ABNORMALLY, 
ioe.getMessage());
+            CloseReason cr = new CloseReason(CloseCodes.CLOSED_ABNORMALLY, 
ioe.getMessage());
             try {
                 session.close(cr);
             } catch (IOException ioe2) {
diff --git 
a/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java 
b/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java
index 37b1cf9626..442b5885ee 100644
--- a/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java
+++ b/webapps/examples/WEB-INF/classes/websocket/snake/SnakeAnnotation.java
@@ -75,6 +75,9 @@ public class SnakeAnnotation {
 
     @OnOpen
     public void onOpen(Session session) {
+        // If the messages take longer than TICK_DELAY to be sent, the game 
isn't going to work properly.
+        
session.getUserProperties().put("org.apache.tomcat.websocket.BLOCKING_SEND_TIMEOUT",
+                Long.valueOf(SnakeTimer.TICK_DELAY));
         this.snake = new Snake(id, session);
         SnakeTimer.addSnake(snake);
         StringBuilder sb = new StringBuilder();
@@ -87,8 +90,7 @@ public class SnakeAnnotation {
                 sb.append(',');
             }
         }
-        SnakeTimer.broadcast(String.format("{\"type\": 
\"join\",\"data\":[%s]}",
-                sb.toString()));
+        SnakeTimer.broadcast(String.format("{\"type\": 
\"join\",\"data\":[%s]}", sb.toString()));
     }
 
 
@@ -109,8 +111,7 @@ public class SnakeAnnotation {
     @OnClose
     public void onClose() {
         SnakeTimer.removeSnake(snake);
-        SnakeTimer.broadcast(String.format("{\"type\": \"leave\", \"id\": %d}",
-                Integer.valueOf(id)));
+        SnakeTimer.broadcast(String.format("{\"type\": \"leave\", \"id\": 
%d}", Integer.valueOf(id)));
     }
 
 
diff --git a/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java 
b/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java
index 6b777e94e3..872f2dcddc 100644
--- a/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java
+++ b/webapps/examples/WEB-INF/classes/websocket/snake/SnakeTimer.java
@@ -36,7 +36,7 @@ public class SnakeTimer {
 
     private static Timer gameTimer = null;
 
-    private static final long TICK_DELAY = 100;
+    static final long TICK_DELAY = 100;
 
     private static final ConcurrentHashMap<Integer, Snake> snakes =
             new ConcurrentHashMap<>();
@@ -73,8 +73,7 @@ public class SnakeTimer {
                 sb.append(',');
             }
         }
-        broadcast(String.format("{\"type\": \"update\", \"data\" : [%s]}",
-                sb.toString()));
+        broadcast(String.format("{\"type\": \"update\", \"data\" : [%s]}", 
sb.toString()));
     }
 
     protected static void broadcast(String message) {


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to