Commit 795a0441 authored by Andy Wilkinson's avatar Andy Wilkinson

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
parents 52479ee0 1f875d55
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
package org.springframework.boot.autoconfigure.jms; package org.springframework.boot.autoconfigure.jms;
import java.time.Duration;
import javax.jms.ConnectionFactory; import javax.jms.ConnectionFactory;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
...@@ -107,6 +109,10 @@ public final class DefaultJmsListenerContainerFactoryConfigurer { ...@@ -107,6 +109,10 @@ public final class DefaultJmsListenerContainerFactoryConfigurer {
if (concurrency != null) { if (concurrency != null) {
factory.setConcurrency(concurrency); factory.setConcurrency(concurrency);
} }
Duration receiveTimeout = listener.getReceiveTimeout();
if (receiveTimeout != null) {
factory.setReceiveTimeout(receiveTimeout.toMillis());
}
} }
} }
...@@ -155,6 +155,13 @@ public class JmsProperties { ...@@ -155,6 +155,13 @@ public class JmsProperties {
*/ */
private Integer maxConcurrency; private Integer maxConcurrency;
/**
* Timeout to use for receive calls. Use -1 for a no-wait receive or 0 for no
* timeout at all. The latter is only feasible if not running within a transaction
* manager and is generally discouraged since it prevents clean shutdown.
*/
private Duration receiveTimeout = Duration.ofSeconds(1);
public boolean isAutoStartup() { public boolean isAutoStartup() {
return this.autoStartup; return this.autoStartup;
} }
...@@ -195,6 +202,14 @@ public class JmsProperties { ...@@ -195,6 +202,14 @@ public class JmsProperties {
: String.valueOf(this.concurrency)); : String.valueOf(this.concurrency));
} }
public Duration getReceiveTimeout() {
return this.receiveTimeout;
}
public void setReceiveTimeout(Duration receiveTimeout) {
this.receiveTimeout = receiveTimeout;
}
} }
public static class Template { public static class Template {
......
...@@ -147,7 +147,7 @@ class JmsAutoConfigurationTests { ...@@ -147,7 +147,7 @@ class JmsAutoConfigurationTests {
this.contextRunner.withUserConfiguration(EnableJmsConfiguration.class) this.contextRunner.withUserConfiguration(EnableJmsConfiguration.class)
.withPropertyValues("spring.jms.listener.autoStartup=false", .withPropertyValues("spring.jms.listener.autoStartup=false",
"spring.jms.listener.acknowledgeMode=client", "spring.jms.listener.concurrency=2", "spring.jms.listener.acknowledgeMode=client", "spring.jms.listener.concurrency=2",
"spring.jms.listener.maxConcurrency=10") "spring.jms.listener.receiveTimeout=2s", "spring.jms.listener.maxConcurrency=10")
.run(this::testJmsListenerContainerFactoryWithCustomSettings); .run(this::testJmsListenerContainerFactoryWithCustomSettings);
} }
...@@ -157,6 +157,18 @@ class JmsAutoConfigurationTests { ...@@ -157,6 +157,18 @@ class JmsAutoConfigurationTests {
assertThat(container.getSessionAcknowledgeMode()).isEqualTo(Session.CLIENT_ACKNOWLEDGE); assertThat(container.getSessionAcknowledgeMode()).isEqualTo(Session.CLIENT_ACKNOWLEDGE);
assertThat(container.getConcurrentConsumers()).isEqualTo(2); assertThat(container.getConcurrentConsumers()).isEqualTo(2);
assertThat(container.getMaxConcurrentConsumers()).isEqualTo(10); assertThat(container.getMaxConcurrentConsumers()).isEqualTo(10);
assertThat(container).hasFieldOrPropertyWithValue("receiveTimeout", 2000L);
}
@Test
void testJmsListenerContainerFactoryWithDefaultSettings() {
this.contextRunner.withUserConfiguration(EnableJmsConfiguration.class)
.run(this::testJmsListenerContainerFactoryWithDefaultSettings);
}
private void testJmsListenerContainerFactoryWithDefaultSettings(AssertableApplicationContext loaded) {
DefaultMessageListenerContainer container = getContainer(loaded, "jmsListenerContainerFactory");
assertThat(container).hasFieldOrPropertyWithValue("receiveTimeout", 1000L);
} }
@Test @Test
......
...@@ -20,6 +20,8 @@ import java.time.Duration; ...@@ -20,6 +20,8 @@ import java.time.Duration;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.jms.listener.AbstractPollingMessageListenerContainer;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
/** /**
...@@ -78,4 +80,10 @@ class JmsPropertiesTests { ...@@ -78,4 +80,10 @@ class JmsPropertiesTests {
assertThat(properties.getTemplate().determineQosEnabled()).isTrue(); assertThat(properties.getTemplate().determineQosEnabled()).isTrue();
} }
@Test
void defaultReceiveTimeoutMatchesListenerContainersDefault() {
assertThat(new JmsProperties().getListener().getReceiveTimeout())
.isEqualTo(Duration.ofMillis(AbstractPollingMessageListenerContainer.DEFAULT_RECEIVE_TIMEOUT));
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment