diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java index ae0fdb262c..862565bdda 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2015 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. @@ -169,6 +169,14 @@ public abstract class AbstractPollingMessageListenerContainer extends AbstractMe this.receiveTimeout = receiveTimeout; } + /** + * Return the receive timeout (ms) configured for this listener container. + * @since 4.2 + */ + protected long getReceiveTimeout() { + return this.receiveTimeout; + } + @Override public void initialize() { diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java index 03a690697a..ba55ecc241 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java @@ -563,7 +563,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe logger.debug("Still waiting for shutdown of " + this.activeInvokerCount + " message listener invokers"); } - this.lifecycleMonitor.wait(); + long timeout = getReceiveTimeout(); + if (timeout > 0) { + this.lifecycleMonitor.wait(timeout); + } + else { + this.lifecycleMonitor.wait(); + } } // Clear remaining scheduled invokers, possibly left over as paused tasks... for (AsyncMessageListenerInvoker scheduledInvoker : this.scheduledInvokers) {