DefaultMessageListenerContainer's recovery phase uses wait instead of sleep

Issue: SPR-14200
This commit is contained in:
Juergen Hoeller
2016-04-27 21:27:21 +02:00
parent b331ad5b2a
commit 6ab8d36ed0

View File

@@ -989,7 +989,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
}
else {
try {
Thread.sleep(interval);
synchronized (this.lifecycleMonitor) {
this.lifecycleMonitor.wait(interval);
}
}
catch (InterruptedException interEx) {
// Re-interrupt current thread, to allow other threads to react.
@@ -1057,9 +1059,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
catch (Throwable ex) {
clearResources();
if (!this.lastMessageSucceeded) {
// We failed more than once in a row or on startup - sleep before
// first recovery attempt.
sleepBeforeRecoveryAttempt();
// We failed more than once in a row or on startup -
// wait before first recovery attempt.
waitBeforeRecoveryAttempt();
}
this.lastMessageSucceeded = false;
boolean alreadyRecovered = false;
@@ -1214,11 +1216,11 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
/**
* Apply the back-off time once. In a regular scenario, the back-off is only applied if we
* failed to recover with the broker. This additional sleep period avoids a burst retry
* failed to recover with the broker. This additional wait period avoids a burst retry
* scenario when the broker is actually up but something else if failing (i.e. listener
* specific).
*/
private void sleepBeforeRecoveryAttempt() {
private void waitBeforeRecoveryAttempt() {
BackOffExecution execution = DefaultMessageListenerContainer.this.backOff.start();
applyBackOffTime(execution);
}