From d7e0776148fd1e378ba81f2ef60b95a0d8cab1a8 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 1 Sep 2010 11:19:11 +0000 Subject: [PATCH] avoid hanging in case of shutdown errors (SPR-7511) --- .../DefaultMessageListenerContainer.java | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/org.springframework.jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java b/org.springframework.jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java index 835b800f9a..10906d8be1 100644 --- a/org.springframework.jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java +++ b/org.springframework.jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java @@ -977,36 +977,38 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe handleListenerSetupFailure(ex, true); } } - synchronized (lifecycleMonitor) { - decreaseActiveInvokerCount(); - lifecycleMonitor.notifyAll(); - } - if (!messageReceived) { - this.idleTaskExecutionCount++; - } - else { - this.idleTaskExecutionCount = 0; - } - synchronized (lifecycleMonitor) { - if (!shouldRescheduleInvoker(this.idleTaskExecutionCount) || !rescheduleTaskIfNecessary(this)) { - // We're shutting down completely. - scheduledInvokers.remove(this); - if (logger.isDebugEnabled()) { - logger.debug("Lowered scheduled invoker count: " + scheduledInvokers.size()); - } + finally { + synchronized (lifecycleMonitor) { + decreaseActiveInvokerCount(); lifecycleMonitor.notifyAll(); - clearResources(); } - else if (isRunning()) { - int nonPausedConsumers = getScheduledConsumerCount() - getPausedTaskCount(); - if (nonPausedConsumers < 1) { - logger.error("All scheduled consumers have been paused, probably due to tasks having been rejected. " + - "Check your thread pool configuration! Manual recovery necessary through a start() call."); + if (!messageReceived) { + this.idleTaskExecutionCount++; + } + else { + this.idleTaskExecutionCount = 0; + } + synchronized (lifecycleMonitor) { + if (!shouldRescheduleInvoker(this.idleTaskExecutionCount) || !rescheduleTaskIfNecessary(this)) { + // We're shutting down completely. + scheduledInvokers.remove(this); + if (logger.isDebugEnabled()) { + logger.debug("Lowered scheduled invoker count: " + scheduledInvokers.size()); + } + lifecycleMonitor.notifyAll(); + clearResources(); } - else if (nonPausedConsumers < getConcurrentConsumers()) { - logger.warn("Number of scheduled consumers has dropped below concurrentConsumers limit, probably " + - "due to tasks having been rejected. Check your thread pool configuration! Automatic recovery " + - "to be triggered by remaining consumers."); + else if (isRunning()) { + int nonPausedConsumers = getScheduledConsumerCount() - getPausedTaskCount(); + if (nonPausedConsumers < 1) { + logger.error("All scheduled consumers have been paused, probably due to tasks having been rejected. " + + "Check your thread pool configuration! Manual recovery necessary through a start() call."); + } + else if (nonPausedConsumers < getConcurrentConsumers()) { + logger.warn("Number of scheduled consumers has dropped below concurrentConsumers limit, probably " + + "due to tasks having been rejected. Check your thread pool configuration! Automatic recovery " + + "to be triggered by remaining consumers."); + } } } }