Skip to content

Commit 795a044

Browse files
committed
Merge pull request #17332 from ibmmqmet
* gh-17332: Polish "Add a config property for JMS listener container's receive timeout" Add a config property for JMS listener container's receive timeout Closes gh-17332
2 parents 52479ee + 1f875d5 commit 795a044

File tree

4 files changed

+42
-1
lines changed

4 files changed

+42
-1
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/DefaultJmsListenerContainerFactoryConfigurer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.autoconfigure.jms;
1818

19+
import java.time.Duration;
20+
1921
import javax.jms.ConnectionFactory;
2022

2123
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
@@ -107,6 +109,10 @@ public void configure(DefaultJmsListenerContainerFactory factory, ConnectionFact
107109
if (concurrency != null) {
108110
factory.setConcurrency(concurrency);
109111
}
112+
Duration receiveTimeout = listener.getReceiveTimeout();
113+
if (receiveTimeout != null) {
114+
factory.setReceiveTimeout(receiveTimeout.toMillis());
115+
}
110116
}
111117

112118
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsProperties.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,13 @@ public static class Listener {
155155
*/
156156
private Integer maxConcurrency;
157157

158+
/**
159+
* Timeout to use for receive calls. Use -1 for a no-wait receive or 0 for no
160+
* timeout at all. The latter is only feasible if not running within a transaction
161+
* manager and is generally discouraged since it prevents clean shutdown.
162+
*/
163+
private Duration receiveTimeout = Duration.ofSeconds(1);
164+
158165
public boolean isAutoStartup() {
159166
return this.autoStartup;
160167
}
@@ -195,6 +202,14 @@ public String formatConcurrency() {
195202
: String.valueOf(this.concurrency));
196203
}
197204

205+
public Duration getReceiveTimeout() {
206+
return this.receiveTimeout;
207+
}
208+
209+
public void setReceiveTimeout(Duration receiveTimeout) {
210+
this.receiveTimeout = receiveTimeout;
211+
}
212+
198213
}
199214

200215
public static class Template {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ void testJmsListenerContainerFactoryWithCustomSettings() {
147147
this.contextRunner.withUserConfiguration(EnableJmsConfiguration.class)
148148
.withPropertyValues("spring.jms.listener.autoStartup=false",
149149
"spring.jms.listener.acknowledgeMode=client", "spring.jms.listener.concurrency=2",
150-
"spring.jms.listener.maxConcurrency=10")
150+
"spring.jms.listener.receiveTimeout=2s", "spring.jms.listener.maxConcurrency=10")
151151
.run(this::testJmsListenerContainerFactoryWithCustomSettings);
152152
}
153153

@@ -157,6 +157,18 @@ private void testJmsListenerContainerFactoryWithCustomSettings(AssertableApplica
157157
assertThat(container.getSessionAcknowledgeMode()).isEqualTo(Session.CLIENT_ACKNOWLEDGE);
158158
assertThat(container.getConcurrentConsumers()).isEqualTo(2);
159159
assertThat(container.getMaxConcurrentConsumers()).isEqualTo(10);
160+
assertThat(container).hasFieldOrPropertyWithValue("receiveTimeout", 2000L);
161+
}
162+
163+
@Test
164+
void testJmsListenerContainerFactoryWithDefaultSettings() {
165+
this.contextRunner.withUserConfiguration(EnableJmsConfiguration.class)
166+
.run(this::testJmsListenerContainerFactoryWithDefaultSettings);
167+
}
168+
169+
private void testJmsListenerContainerFactoryWithDefaultSettings(AssertableApplicationContext loaded) {
170+
DefaultMessageListenerContainer container = getContainer(loaded, "jmsListenerContainerFactory");
171+
assertThat(container).hasFieldOrPropertyWithValue("receiveTimeout", 1000L);
160172
}
161173

162174
@Test

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsPropertiesTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import org.junit.jupiter.api.Test;
2222

23+
import org.springframework.jms.listener.AbstractPollingMessageListenerContainer;
24+
2325
import static org.assertj.core.api.Assertions.assertThat;
2426

2527
/**
@@ -78,4 +80,10 @@ void setTimeToLiveEnablesQoS() {
7880
assertThat(properties.getTemplate().determineQosEnabled()).isTrue();
7981
}
8082

83+
@Test
84+
void defaultReceiveTimeoutMatchesListenerContainersDefault() {
85+
assertThat(new JmsProperties().getListener().getReceiveTimeout())
86+
.isEqualTo(Duration.ofMillis(AbstractPollingMessageListenerContainer.DEFAULT_RECEIVE_TIMEOUT));
87+
}
88+
8189
}

0 commit comments

Comments
 (0)