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

davsclaus pushed a commit to branch camel-3.11.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-3.11.x by this push:
     new a795221  CAMEL-17503: fix websocket client unable to reconnect to 
Server after server reboot (#6792)
a795221 is described below

commit a795221c591780830d00e5e2dbf8cfcc43c662f9
Author: CG <cg...@users.noreply.github.com>
AuthorDate: Thu Jan 20 22:50:13 2022 +0800

    CAMEL-17503: fix websocket client unable to reconnect to Server after 
server reboot (#6792)
    
    Co-authored-by: CG <chengguan.po...@thalesdigital.io>
---
 .../apache/camel/component/ahc/ws/WsEndpoint.java  |  8 ++++++-
 .../apache/camel/component/ahc/ws/TestServlet.java |  1 +
 .../component/ahc/ws/WsProducerConsumerTest.java   | 27 +++++++++++++++++++++-
 3 files changed, 34 insertions(+), 2 deletions(-)

diff --git 
a/components/camel-ahc-ws/src/main/java/org/apache/camel/component/ahc/ws/WsEndpoint.java
 
b/components/camel-ahc-ws/src/main/java/org/apache/camel/component/ahc/ws/WsEndpoint.java
index 2dbce5d..bc72c41 100644
--- 
a/components/camel-ahc-ws/src/main/java/org/apache/camel/component/ahc/ws/WsEndpoint.java
+++ 
b/components/camel-ahc-ws/src/main/java/org/apache/camel/component/ahc/ws/WsEndpoint.java
@@ -172,9 +172,15 @@ public class WsEndpoint extends AhcEndpoint {
         }
 
         @Override
-        public void onClose(WebSocket websocket, int code, String reason) {
+        public void onClose(WebSocket socket, int code, String reason) {
             LOG.debug("websocket closed - reconnecting");
             try {
+                if (websocket != null) {
+                    // set websocket to null and remove the listener
+                    websocket.removeWebSocketListener(listener);
+                    websocket.sendCloseFrame();
+                    websocket = null;
+                }
                 reConnect();
             } catch (Exception e) {
                 LOG.warn("Error re-connecting to websocket", e);
diff --git 
a/components/camel-ahc-ws/src/test/java/org/apache/camel/component/ahc/ws/TestServlet.java
 
b/components/camel-ahc-ws/src/test/java/org/apache/camel/component/ahc/ws/TestServlet.java
index 440b9d1..99a924b 100644
--- 
a/components/camel-ahc-ws/src/test/java/org/apache/camel/component/ahc/ws/TestServlet.java
+++ 
b/components/camel-ahc-ws/src/test/java/org/apache/camel/component/ahc/ws/TestServlet.java
@@ -34,6 +34,7 @@ public class TestServlet {
     @OnWebSocketConnect
     public void handleConnect(Session session) {
         this.session = session;
+        send("Connected!");
     }
 
     @OnWebSocketMessage
diff --git 
a/components/camel-ahc-ws/src/test/java/org/apache/camel/component/ahc/ws/WsProducerConsumerTest.java
 
b/components/camel-ahc-ws/src/test/java/org/apache/camel/component/ahc/ws/WsProducerConsumerTest.java
index 1f8a800..3711794 100644
--- 
a/components/camel-ahc-ws/src/test/java/org/apache/camel/component/ahc/ws/WsProducerConsumerTest.java
+++ 
b/components/camel-ahc-ws/src/test/java/org/apache/camel/component/ahc/ws/WsProducerConsumerTest.java
@@ -40,6 +40,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 public class WsProducerConsumerTest extends CamelTestSupport {
 
     protected static final String TEST_MESSAGE = "Hello World!";
+    protected static final String TEST_CONNECTED_MESSAGE = "Connected!";
     protected static final int PORT = AvailablePortFinder.getNextAvailable();
 
     private static final Logger LOG = 
LoggerFactory.getLogger(WsProducerConsumerTest.class);
@@ -139,9 +140,27 @@ public class WsProducerConsumerTest extends 
CamelTestSupport {
         mock.assertIsSatisfied();
     }
 
+    @Test
+    public void testRestartServer() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:restart-result");
+        mock.expectedBodiesReceived(TEST_CONNECTED_MESSAGE);
+
+        mock.assertIsSatisfied();
+
+        LOG.info("Restarting Test Server");
+        stopTestServer();
+        startTestServer();
+
+        resetMocks();
+
+        mock.expectedBodiesReceived(TEST_CONNECTED_MESSAGE);
+
+        mock.assertIsSatisfied();
+    }
+
     @Override
     protected RouteBuilder[] createRouteBuilders() throws Exception {
-        RouteBuilder[] rbs = new RouteBuilder[2];
+        RouteBuilder[] rbs = new RouteBuilder[3];
         rbs[0] = new RouteBuilder() {
             public void configure() {
                 from("direct:input").routeId("foo")
@@ -154,6 +173,12 @@ public class WsProducerConsumerTest extends 
CamelTestSupport {
                         .to("mock:result");
             }
         };
+        rbs[2] = new RouteBuilder() {
+            public void configure() {
+                from("ahc-ws://localhost:" + PORT + 
"/restart").routeId("restart")
+                        .to("mock:restart-result");
+            }
+        };
         return rbs;
     }
 }

Reply via email to