From 840ece5362f45828b54dc51bf8d8bdb5e5f86a5b Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Wed, 25 Oct 2017 15:06:47 -0400 Subject: [PATCH] Fix `AsyncRabbitTemplate.stop()` for NPE The `this.taskScheduler` reset is done outside of the `if (this.running) {` block causing NPE on the second `stop()` call **Cherry-pick to 1.7.x & 1.6.x** Conflicts: spring-rabbit/src/test/java/org/springframework/amqp/rabbit/AsyncRabbitTemplateTests.java Resolved. --- .../springframework/amqp/rabbit/AsyncRabbitTemplate.java | 8 ++++---- .../amqp/rabbit/AsyncRabbitTemplateTests.java | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/AsyncRabbitTemplate.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/AsyncRabbitTemplate.java index 8f2cbb1a..f4fa65f5 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/AsyncRabbitTemplate.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/AsyncRabbitTemplate.java @@ -438,10 +438,10 @@ public class AsyncRabbitTemplate implements SmartLifecycle, MessageListener, Ret future.setNackCause("AsyncRabbitTemplate was stopped while waiting for reply"); future.cancel(true); } - } - if (this.internalTaskScheduler) { - ((ThreadPoolTaskScheduler) this.taskScheduler).destroy(); - this.taskScheduler = null; + if (this.internalTaskScheduler) { + ((ThreadPoolTaskScheduler) this.taskScheduler).destroy(); + this.taskScheduler = null; + } } this.running = false; } diff --git a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/AsyncRabbitTemplateTests.java b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/AsyncRabbitTemplateTests.java index 3af5f5cb..eebbe1d7 100644 --- a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/AsyncRabbitTemplateTests.java +++ b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/AsyncRabbitTemplateTests.java @@ -67,6 +67,8 @@ import org.springframework.util.concurrent.ListenableFutureCallback; /** * @author Gary Russell + * @author Artem Bilan + * * @since 1.6 */ @ContextConfiguration @@ -252,6 +254,8 @@ public class AsyncRabbitTemplateTests { future.addCallback(callback); assertEquals(1, TestUtils.getPropertyValue(this.template, "pending", Map.class).size()); this.template.stop(); + // Second stop() to be sure that it is idempotent + this.template.stop(); try { future.get(10, TimeUnit.SECONDS); fail("Expected CancellationException");