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
This commit is contained in:
@@ -16,6 +16,8 @@
|
||||
|
||||
package org.springframework.boot.autoconfigure.jms;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
import javax.jms.ConnectionFactory;
|
||||
|
||||
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
|
||||
@@ -107,6 +109,10 @@ public final class DefaultJmsListenerContainerFactoryConfigurer {
|
||||
if (concurrency != null) {
|
||||
factory.setConcurrency(concurrency);
|
||||
}
|
||||
Duration receiveTimeout = listener.getReceiveTimeout();
|
||||
if (receiveTimeout != null) {
|
||||
factory.setReceiveTimeout(receiveTimeout.toMillis());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -155,6 +155,13 @@ public class JmsProperties {
|
||||
*/
|
||||
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() {
|
||||
return this.autoStartup;
|
||||
}
|
||||
@@ -195,6 +202,14 @@ public class JmsProperties {
|
||||
: String.valueOf(this.concurrency));
|
||||
}
|
||||
|
||||
public Duration getReceiveTimeout() {
|
||||
return this.receiveTimeout;
|
||||
}
|
||||
|
||||
public void setReceiveTimeout(Duration receiveTimeout) {
|
||||
this.receiveTimeout = receiveTimeout;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Template {
|
||||
|
||||
@@ -147,7 +147,7 @@ class JmsAutoConfigurationTests {
|
||||
this.contextRunner.withUserConfiguration(EnableJmsConfiguration.class)
|
||||
.withPropertyValues("spring.jms.listener.autoStartup=false",
|
||||
"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);
|
||||
}
|
||||
|
||||
@@ -157,6 +157,18 @@ class JmsAutoConfigurationTests {
|
||||
assertThat(container.getSessionAcknowledgeMode()).isEqualTo(Session.CLIENT_ACKNOWLEDGE);
|
||||
assertThat(container.getConcurrentConsumers()).isEqualTo(2);
|
||||
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
|
||||
|
||||
@@ -20,6 +20,8 @@ import java.time.Duration;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.jms.listener.AbstractPollingMessageListenerContainer;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
@@ -78,4 +80,10 @@ class JmsPropertiesTests {
|
||||
assertThat(properties.getTemplate().determineQosEnabled()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void defaultReceiveTimeoutMatchesListenerContainersDefault() {
|
||||
assertThat(new JmsProperties().getListener().getReceiveTimeout())
|
||||
.isEqualTo(Duration.ofMillis(AbstractPollingMessageListenerContainer.DEFAULT_RECEIVE_TIMEOUT));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user