From 8b67472e35398f8c8fcf0b8e136ed87022216a86 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 21 Mar 2026 12:04:29 +0100 Subject: [PATCH] Avoid endless re-interruption loop on shutdown Closes gh-36506 --- .../jms/listener/DefaultMessageListenerContainer.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 f99e05a1630..7c40194d83b 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 @@ -737,14 +737,20 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe long receiveTimeout = getReceiveTimeout(); long waitStartTime = System.currentTimeMillis(); int waitCount = 0; + boolean interrupted = false; while (this.activeInvokerCount > 0) { if (waitCount > 0 && !isAcceptMessagesWhileStopping() && System.currentTimeMillis() - waitStartTime >= receiveTimeout) { // Unexpectedly some invokers are still active after the receive timeout period // -> interrupt remaining receive attempts since we'd reject the messages anyway + if (interrupted) { + // Already interrupted -> not worth waiting any longer... + break; + } for (AsyncMessageListenerInvoker scheduledInvoker : this.scheduledInvokers) { scheduledInvoker.interruptIfNecessary(); } + interrupted = true; } if (logger.isDebugEnabled()) { logger.debug("Still waiting for shutdown of " + this.activeInvokerCount +