From 6b3284f6b00b170c747a900033dbad6748cfd503 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 13 Dec 2012 11:29:40 +0100 Subject: [PATCH] DefaultMessageListenerContainer clears resources of paused tasks when shutting down after stop Issue: SPR-10092 --- .../jms/listener/AbstractJmsListeningContainer.java | 1 + .../listener/DefaultMessageListenerContainer.java | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java index 6a2dc5e0d4..6ce99ad089 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java @@ -214,6 +214,7 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess wasRunning = this.running; this.running = false; this.active = false; + this.pausedTasks.clear(); this.lifecycleMonitor.notifyAll(); } 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 d738ca3ec9..5a6f3cbc3c 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 @@ -337,9 +337,10 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe * to scale the consumption of messages coming in from a queue. However, * note that any ordering guarantees are lost once multiple consumers are * registered. In general, stick with 1 consumer for low-volume queues. - *

Do not raise the number of concurrent consumers for a topic. - * This would lead to concurrent consumption of the same message, - * which is hardly ever desirable. + *

Do not raise the number of concurrent consumers for a topic, + * unless vendor-specific setup measures clearly allow for it. + * With regular setup, this would lead to concurrent consumption + * of the same message, which is hardly ever desirable. *

This setting can be modified at runtime, for example through JMX. * @see #setConcurrentConsumers */ @@ -526,6 +527,7 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe logger.debug("Waiting for shutdown of message listener invokers"); try { synchronized (this.lifecycleMonitor) { + // Waiting for AsyncMessageListenerInvokers to deactivate themselves... while (this.activeInvokerCount > 0) { if (logger.isDebugEnabled()) { logger.debug("Still waiting for shutdown of " + this.activeInvokerCount + @@ -533,6 +535,11 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe } this.lifecycleMonitor.wait(); } + // Clear remaining scheduled invokers, possibly left over as paused tasks... + for (AsyncMessageListenerInvoker scheduledInvoker : this.scheduledInvokers) { + scheduledInvoker.clearResources(); + } + this.scheduledInvokers.clear(); } } catch (InterruptedException ex) {