From 08f2ab942ca9bb982a60a5ae236f4227da814c30 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 16 Feb 2016 22:28:10 +0100 Subject: [PATCH] DefaultMessageListenerContainer stops if recovery failed after interrupt signal Issue: SPR-11787 (cherry picked from commit 1253b45) --- .../listener/DefaultMessageListenerContainer.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 c48c3439df7..06209132b36 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 @@ -197,6 +197,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe private volatile boolean recovering = false; + private volatile boolean interrupted = false; + private Runnable stopCallback; private Object currentRecoveryMarker = new Object(); @@ -893,6 +895,7 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe } finally { this.recovering = false; + this.interrupted = false; } } @@ -976,6 +979,10 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe * @since 4.1 */ protected boolean applyBackOffTime(BackOffExecution execution) { + if (this.recovering && this.interrupted) { + // Interrupted right before and still failing... give up. + return false; + } long interval = execution.nextBackOff(); if (interval == BackOffExecution.STOP) { return false; @@ -987,9 +994,12 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe catch (InterruptedException interEx) { // Re-interrupt current thread, to allow other threads to react. Thread.currentThread().interrupt(); + if (this.recovering) { + this.interrupted = true; + } } + return true; } - return true; } /**