From b928d7fc877095808596196e49e1165259aab748 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Mon, 13 Jul 2026 11:55:24 +0000 Subject: [PATCH] CAMEL-24049: Fix flaky JMS Spring tests - queue name isolation and readiness checks - Rename hardcoded queue names (foo, bar) to class-scoped names in JmsSpringLoadBalanceFailOverIT.xml to prevent cross-test contamination - Add route IDs to Spring XML routes for readiness check targeting - Add JmsTestHelper.waitForJmsConsumerRoutes() calls to ensure JMS consumers are fully subscribed before sending messages - Replace bare MockEndpoint.assertIsSatisfied() with timed assertions - Fix queue name mismatch in RouteIdTransactedIT (was using old class name) Affected tests: JmsSpringLoadBalanceFailOverJMSIT, RouteIdTransactedIT, JmsRouteUsingSpringIT, JmsRouteUsingSpringAndJmsNameIT, JmsRouteUsingSpringJMSTemplateIT, JmsRouteUsingSpringWithAutoWireIT Co-Authored-By: Claude Opus 4.6 --- .../apache/camel/component/jms/JmsRouteTest.java | 12 ++++++++---- .../spring/JmsSpringLoadBalanceFailOverJMSIT.java | 4 ++++ .../integration/spring/tx/RouteIdTransactedIT.java | 13 ++++++++++--- .../spring/JmsSpringLoadBalanceFailOverIT.xml | 14 +++++++------- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteTest.java index b93be1ba8db73..b26631882af50 100644 --- a/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteTest.java +++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteTest.java @@ -17,6 +17,7 @@ package org.apache.camel.component.jms; import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; import org.apache.camel.CamelContext; import org.apache.camel.ConsumerTemplate; @@ -57,7 +58,7 @@ public void testSendEmptyMessage() throws Exception { sendExchange(""); sendExchange(null); - resultEndpoint.assertIsSatisfied(); + MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); } protected void assertSendAndReceiveBody(Object expectedBody) throws InterruptedException { @@ -66,7 +67,7 @@ protected void assertSendAndReceiveBody(Object expectedBody) throws InterruptedE sendExchange(expectedBody); - resultEndpoint.assertIsSatisfied(); + MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); } protected void sendExchange(final Object expectedBody) { @@ -85,8 +86,8 @@ protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { public void configure() { - from(startEndpointUri).to(endEndpointUri); - from(endEndpointUri).to("mock:result"); + from(startEndpointUri).routeId("jmsRoute1").to(endEndpointUri); + from(endEndpointUri).routeId("jmsRoute2").to("mock:result"); } }; } @@ -103,5 +104,8 @@ void setUpRequirements() { consumer = camelContextExtension.getConsumerTemplate(); resultEndpoint = context.getEndpoint("mock:result", MockEndpoint.class); + + // Wait for the JMS consumer routes to be fully subscribed to the broker + JmsTestHelper.waitForJmsConsumerRoutes(context, "jmsRoute1", "jmsRoute2"); } } diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/spring/JmsSpringLoadBalanceFailOverJMSIT.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/spring/JmsSpringLoadBalanceFailOverJMSIT.java index cbdea830c033d..798fc0bf70f0e 100644 --- a/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/spring/JmsSpringLoadBalanceFailOverJMSIT.java +++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/spring/JmsSpringLoadBalanceFailOverJMSIT.java @@ -18,6 +18,7 @@ import java.util.concurrent.TimeUnit; +import org.apache.camel.component.jms.JmsTestHelper; import org.apache.camel.component.mock.MockEndpoint; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Tags; @@ -45,6 +46,9 @@ protected AbstractApplicationContext createApplicationContext() { @Test public void testFailover() throws Exception { + // Wait for the JMS consumer routes to be fully subscribed to the broker + JmsTestHelper.waitForJmsConsumerRoutes(context, "fooConsumerRoute", "barConsumerRoute"); + getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:bar").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/spring/tx/RouteIdTransactedIT.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/spring/tx/RouteIdTransactedIT.java index 7297aca9b1ec3..7cb94960ab5d1 100644 --- a/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/spring/tx/RouteIdTransactedIT.java +++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/integration/spring/tx/RouteIdTransactedIT.java @@ -19,6 +19,7 @@ import java.util.concurrent.TimeUnit; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.jms.JmsTestHelper; import org.apache.camel.component.jms.integration.spring.AbstractSpringJMSITSupport; import org.apache.camel.component.mock.MockEndpoint; import org.junit.jupiter.api.MethodOrderer; @@ -44,10 +45,13 @@ protected ClassPathXmlApplicationContext createApplicationContext() { @Order(1) @Test public void testRouteId() throws Exception { + // Wait for the JMS consumer route to be fully subscribed to the broker + JmsTestHelper.waitForJmsConsumerRoutes(context, "myCoolRoute"); + getMockEndpoint("mock:error").expectedMessageCount(0); getMockEndpoint("mock:result").expectedMessageCount(1); - template.sendBody("activemq:queue:RouteIdTransactedTest", "Hello World"); + template.sendBody("activemq:queue:RouteIdTransactedIT", "Hello World"); MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); @@ -58,10 +62,13 @@ public void testRouteId() throws Exception { @Order(2) @Test public void testRouteIdFailed() throws Exception { + // Wait for the JMS consumer route to be fully subscribed to the broker + JmsTestHelper.waitForJmsConsumerRoutes(context, "myCoolRoute"); + getMockEndpoint("mock:error").expectedMessageCount(1); getMockEndpoint("mock:result").expectedMessageCount(0); - template.sendBody("activemq:queue:RouteIdTransactedTest", "Kaboom"); + template.sendBody("activemq:queue:RouteIdTransactedIT", "Kaboom"); MockEndpoint.assertIsSatisfied(context, 30, TimeUnit.SECONDS); @@ -74,7 +81,7 @@ protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { @Override public void configure() { - from("activemq:queue:RouteIdTransactedTest?transacted=true").id("myCoolRoute") + from("activemq:queue:RouteIdTransactedIT?transacted=true").id("myCoolRoute") .onException(IllegalArgumentException.class).handled(true).to("log:bar").to("mock:error").end() .transacted() .choice() diff --git a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/integration/spring/JmsSpringLoadBalanceFailOverIT.xml b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/integration/spring/JmsSpringLoadBalanceFailOverIT.xml index 002943454c188..898b5d93903f4 100644 --- a/components/camel-jms/src/test/resources/org/apache/camel/component/jms/integration/spring/JmsSpringLoadBalanceFailOverIT.xml +++ b/components/camel-jms/src/test/resources/org/apache/camel/component/jms/integration/spring/JmsSpringLoadBalanceFailOverIT.xml @@ -41,24 +41,24 @@ - + - - + + - - + + - - + + Bye World