From b0457a93533abd86b5d9f04a34da0c0f9ec080e5 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Thu, 6 Feb 2025 16:38:31 -0500 Subject: [PATCH] Fix RepublishMessageRecovererIntegrationTests for race condition For the proper clean up the `CachingConnectionFactory` must be supplied with an `ApplicationContext` and respective `ContextClosedEvent` has to be emitted (cherry picked from commit 0c7479c698e9a9d475e5e571f358c39e8b69677d) --- ...epublishMessageRecovererIntegrationTests.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/retry/RepublishMessageRecovererIntegrationTests.java b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/retry/RepublishMessageRecovererIntegrationTests.java index 60eb65ce..abc6af19 100644 --- a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/retry/RepublishMessageRecovererIntegrationTests.java +++ b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/retry/RepublishMessageRecovererIntegrationTests.java @@ -29,11 +29,16 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.junit.RabbitAvailable; import org.springframework.amqp.rabbit.junit.RabbitAvailableCondition; import org.springframework.amqp.rabbit.support.ListenerExecutionFailedException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.event.ContextClosedEvent; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; /** * @author Gary Russell + * @author Artem Bilan + * * @since 2.0.5 * */ @@ -52,6 +57,8 @@ class RepublishMessageRecovererIntegrationTests { void testBigHeader() { CachingConnectionFactory ccf = new CachingConnectionFactory( RabbitAvailableCondition.getBrokerRunning().getConnectionFactory()); + ApplicationContext applicationContext = mock(); + ccf.setApplicationContext(applicationContext); RabbitTemplate template = new RabbitTemplate(ccf); this.maxHeaderSize = RabbitUtils.getMaxFrame(template.getConnectionFactory()) - RepublishMessageRecoverer.DEFAULT_FRAME_MAX_HEADROOM; @@ -69,7 +76,8 @@ class RepublishMessageRecovererIntegrationTests { "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..."; assertThat(trace).contains(truncatedMessage); assertThat((String) received.getMessageProperties().getHeader(RepublishMessageRecoverer.X_EXCEPTION_MESSAGE)) - .isEqualTo(truncatedMessage); + .isEqualTo(truncatedMessage); + ccf.onApplicationEvent(new ContextClosedEvent(applicationContext)); ccf.destroy(); } @@ -77,6 +85,8 @@ class RepublishMessageRecovererIntegrationTests { void testSmallException() { CachingConnectionFactory ccf = new CachingConnectionFactory( RabbitAvailableCondition.getBrokerRunning().getConnectionFactory()); + ApplicationContext applicationContext = mock(); + ccf.setApplicationContext(applicationContext); RabbitTemplate template = new RabbitTemplate(ccf); this.maxHeaderSize = RabbitUtils.getMaxFrame(template.getConnectionFactory()) - RepublishMessageRecoverer.DEFAULT_FRAME_MAX_HEADROOM; @@ -91,6 +101,7 @@ class RepublishMessageRecovererIntegrationTests { String trace = received.getMessageProperties().getHeaders() .get(RepublishMessageRecoverer.X_EXCEPTION_STACKTRACE).toString(); assertThat(trace).isEqualTo(getStackTraceAsString(cause)); + ccf.onApplicationEvent(new ContextClosedEvent(applicationContext)); ccf.destroy(); } @@ -99,6 +110,8 @@ class RepublishMessageRecovererIntegrationTests { CachingConnectionFactory ccf = new CachingConnectionFactory( RabbitAvailableCondition.getBrokerRunning().getConnectionFactory()); RabbitTemplate template = new RabbitTemplate(ccf); + ApplicationContext applicationContext = mock(); + ccf.setApplicationContext(applicationContext); this.maxHeaderSize = RabbitUtils.getMaxFrame(template.getConnectionFactory()) - RepublishMessageRecoverer.DEFAULT_FRAME_MAX_HEADROOM; assertThat(this.maxHeaderSize).isGreaterThan(0); @@ -117,6 +130,7 @@ class RepublishMessageRecovererIntegrationTests { .getHeader(RepublishMessageRecoverer.X_EXCEPTION_MESSAGE).toString(); assertThat(trace.length() + exceptionMessage.length()).isEqualTo(this.maxHeaderSize); assertThat(exceptionMessage).endsWith("..."); + ccf.onApplicationEvent(new ContextClosedEvent(applicationContext)); ccf.destroy(); }