diff --git a/components/camel-undertow/pom.xml b/components/camel-undertow/pom.xml
index 5da11c33f5ef2..5ed99a6b734e0 100644
--- a/components/camel-undertow/pom.xml
+++ b/components/camel-undertow/pom.xml
@@ -127,6 +127,12 @@
junit-jupiter
test
+
+ org.awaitility
+ awaitility
+ ${awaitility-version}
+ test
+
org.eclipse.jetty.http2
jetty-http2-client
diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/ws/UndertowWsConsumerRouteTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/ws/UndertowWsConsumerRouteTest.java
index 84752761c8916..4fd6fc7a8e265 100644
--- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/ws/UndertowWsConsumerRouteTest.java
+++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/ws/UndertowWsConsumerRouteTest.java
@@ -46,6 +46,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import static org.awaitility.Awaitility.await;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -168,9 +169,15 @@ public void echo() throws Exception {
wsclient1.connect();
wsclient1.sendTextMessage("Test1");
- wsclient1.sendTextMessage("Test2");
+ // Wait for the first echo before sending the next message to avoid
+ // IllegalStateException from JDK WebSocket when a send is still pending.
+ // Poll using size() to avoid iterating the non-thread-safe received list.
+ await().atMost(10, TimeUnit.SECONDS)
+ .until(() -> wsclient1.getReceived().size() >= 1);
- assertTrue(wsclient1.await(10));
+ wsclient1.sendTextMessage("Test2");
+ await().atMost(10, TimeUnit.SECONDS)
+ .until(() -> wsclient1.getReceived().size() >= 2);
assertEquals(Arrays.asList("Test1", "Test2"), wsclient1.getReceived(String.class));
@@ -187,8 +194,9 @@ public void echoMulti() throws Exception {
wsclient1.sendTextMessage("Gambas");
wsclient2.sendTextMessage("Calamares");
- assertTrue(wsclient1.await(10));
- assertTrue(wsclient2.await(10));
+ // Poll using size() to avoid iterating the non-thread-safe received list
+ await().atMost(10, TimeUnit.SECONDS)
+ .until(() -> wsclient1.getReceived().size() >= 1 && wsclient2.getReceived().size() >= 1);
assertEquals(List.of("Gambas"), wsclient1.getReceived(String.class));
assertEquals(List.of("Calamares"), wsclient2.getReceived(String.class));
@@ -207,12 +215,12 @@ public void sendToAll() throws Exception {
wsclient1.sendTextMessage("Gambas");
wsclient2.sendTextMessage("Calamares");
- assertTrue(wsclient1.await(10));
- assertTrue(wsclient2.await(10));
+ // Poll using size() to avoid iterating the non-thread-safe received list
+ await().atMost(10, TimeUnit.SECONDS)
+ .until(() -> wsclient1.getReceived().size() >= 2 && wsclient2.getReceived().size() >= 2);
List received1 = wsclient1.getReceived(String.class);
assertEquals(2, received1.size());
-
assertTrue(received1.contains("Gambas"));
assertTrue(received1.contains("Calamares"));
@@ -292,12 +300,16 @@ public void connectionKeyList() throws Exception {
wsclient2.connect();
wsclient3.connect();
- wsclient1.await(10);
+ // Poll using size() to avoid iterating the non-thread-safe received list
+ await().atMost(10, TimeUnit.SECONDS)
+ .until(() -> wsclient1.getReceived().size() >= 1);
final String connectionKey1 = assertConnected(wsclient1);
assertNotNull(connectionKey1);
- wsclient2.await(10);
+ await().atMost(10, TimeUnit.SECONDS)
+ .until(() -> wsclient2.getReceived().size() >= 1);
final String connectionKey2 = assertConnected(wsclient2);
- wsclient3.await(10);
+ await().atMost(10, TimeUnit.SECONDS)
+ .until(() -> wsclient3.getReceived().size() >= 1);
final String connectionKey3 = assertConnected(wsclient3);
wsclient1.reset(1);
@@ -305,13 +317,16 @@ public void connectionKeyList() throws Exception {
wsclient3.reset(1);
final String broadcastMsg = BROADCAST_MESSAGE_PREFIX + connectionKey2 + " " + connectionKey3;
wsclient1.sendTextMessage(broadcastMsg); // this one should go to wsclient2 and wsclient3
- wsclient1.sendTextMessage("private"); // this one should go to wsclient1 only
-
- wsclient2.await(10);
+ // Wait for broadcast delivery before sending the next message to avoid
+ // IllegalStateException from JDK WebSocket when a send is still pending
+ await().atMost(10, TimeUnit.SECONDS)
+ .until(() -> wsclient2.getReceived().size() >= 1 && wsclient3.getReceived().size() >= 1);
assertEquals(broadcastMsg, wsclient2.getReceived(String.class).get(0));
- wsclient3.await(10);
assertEquals(broadcastMsg, wsclient3.getReceived(String.class).get(0));
- wsclient1.await(10);
+
+ wsclient1.sendTextMessage("private"); // this one should go to wsclient1 only
+ await().atMost(10, TimeUnit.SECONDS)
+ .until(() -> wsclient1.getReceived().size() >= 1);
assertEquals("private", wsclient1.getReceived(String.class).get(0));
wsclient1.close();