GH-10046: Propagate error strategy in the JmsEndpoint

Fixes: #10046
Issue link: https://github.com/spring-projects/spring-integration/issues/10046

The `JmsMessageDrivenEndpoint` does not propagate an `ErrorMessageStrategy` down to the `ChannelPublishingJmsMessageListener.GatewayDelegate`

* Expose `JmsMessageDrivenEndpoint.setErrorMessageStrategy()` and call respective `this.listener.setErrorMessageStrategy()`

(cherry picked from commit da1ec071c5)
This commit is contained in:
Artem Bilan
2025-05-20 11:20:39 -04:00
committed by Spring Builds
parent c60dc9ec7b
commit 31544a3144
4 changed files with 30 additions and 5 deletions

View File

@@ -164,7 +164,7 @@ public abstract class MessageProducerSupport extends AbstractEndpoint
* @param errorMessageStrategy the {@link ErrorMessageStrategy}.
* @since 4.3.10
*/
public final void setErrorMessageStrategy(ErrorMessageStrategy errorMessageStrategy) {
public void setErrorMessageStrategy(ErrorMessageStrategy errorMessageStrategy) {
Assert.notNull(errorMessageStrategy, "'errorMessageStrategy' cannot be null");
this.errorMessageStrategy = errorMessageStrategy;
}

View File

@@ -42,6 +42,7 @@ import org.springframework.integration.expression.ExpressionUtils;
import org.springframework.integration.gateway.MessagingGatewaySupport;
import org.springframework.integration.jms.support.JmsMessageHeaderErrorMessageStrategy;
import org.springframework.integration.support.DefaultMessageBuilderFactory;
import org.springframework.integration.support.ErrorMessageStrategy;
import org.springframework.integration.support.ErrorMessageUtils;
import org.springframework.integration.support.MessageBuilderFactory;
import org.springframework.integration.support.management.TrackableComponent;
@@ -337,6 +338,10 @@ public class ChannelPublishingJmsMessageListener
this.extractReplyPayload = extractReplyPayload;
}
public void setErrorMessageStrategy(ErrorMessageStrategy errorMessageStrategy) {
this.gatewayDelegate.setErrorMessageStrategy(errorMessageStrategy);
}
public void setMetricsCaptor(MetricsCaptor captor) {
this.gatewayDelegate.registerMetricsCaptor(captor);
}

View File

@@ -23,6 +23,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.integration.context.OrderlyShutdownCapable;
import org.springframework.integration.endpoint.MessageProducerSupport;
import org.springframework.integration.jms.util.JmsAdapterUtils;
import org.springframework.integration.support.ErrorMessageStrategy;
import org.springframework.integration.support.management.metrics.MetricsCaptor;
import org.springframework.integration.support.management.observation.MessageReceiverObservationConvention;
import org.springframework.jms.listener.AbstractMessageListenerContainer;
@@ -137,6 +138,12 @@ public class JmsMessageDrivenEndpoint extends MessageProducerSupport implements
this.listener.setShouldTrack(shouldTrack);
}
@Override
public void setErrorMessageStrategy(ErrorMessageStrategy errorMessageStrategy) {
super.setErrorMessageStrategy(errorMessageStrategy);
this.listener.setErrorMessageStrategy(errorMessageStrategy);
}
/**
* Set to {@code false} to prevent listener container shutdown when the endpoint is stopped.
* Then, if so configured, any cached consumer(s) in the container will remain.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2018-2024 the original author or authors.
* Copyright 2018-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@ import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.jms.ActiveMQMultiContextTests;
import org.springframework.integration.jms.ChannelPublishingJmsMessageListener;
import org.springframework.integration.jms.JmsMessageDrivenEndpoint;
import org.springframework.integration.support.ErrorMessageStrategy;
import org.springframework.integration.test.util.TestUtils;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.listener.AbstractMessageListenerContainer;
@@ -61,7 +62,9 @@ public class JmsMessageDrivenEndpointTests extends ActiveMQMultiContextTests {
@Test
public void testStopStart(@Autowired JmsTemplate template,
@Autowired JmsMessageDrivenEndpoint endpoint, @Autowired QueueChannel out) {
@Autowired JmsMessageDrivenEndpoint endpoint, @Autowired QueueChannel out,
@Autowired ErrorMessageStrategy mockErrorMessageStrategy) {
template.convertAndSend("stop.start", "foo");
assertThat(out.receive(10_000).getPayload()).isEqualTo("foo");
endpoint.stop();
@@ -69,6 +72,9 @@ public class JmsMessageDrivenEndpointTests extends ActiveMQMultiContextTests {
endpoint.start();
template.convertAndSend("stop.start", "bar");
assertThat(out.receive(10_000).getPayload()).isEqualTo("bar");
assertThat(TestUtils.getPropertyValue(endpoint, "listener.gatewayDelegate.errorMessageStrategy"))
.isSameAs(mockErrorMessageStrategy);
}
@Configuration
@@ -81,8 +87,15 @@ public class JmsMessageDrivenEndpointTests extends ActiveMQMultiContextTests {
}
@Bean
public JmsMessageDrivenEndpoint inbound() {
return new JmsMessageDrivenEndpoint(container(), listener());
ErrorMessageStrategy mockErrorMessageStrategy() {
return mock();
}
@Bean
public JmsMessageDrivenEndpoint inbound(ErrorMessageStrategy mockErrorMessageStrategy) {
JmsMessageDrivenEndpoint jmsMessageDrivenEndpoint = new JmsMessageDrivenEndpoint(container(), listener());
jmsMessageDrivenEndpoint.setErrorMessageStrategy(mockErrorMessageStrategy);
return jmsMessageDrivenEndpoint;
}
@Bean