diff --git a/akka-actor-tests/src/test/scala/akka/pattern/BackoffSupervisorSpec.scala b/akka-actor-tests/src/test/scala/akka/pattern/BackoffSupervisorSpec.scala index 4daf26bf9b..b60641fd13 100644 --- a/akka-actor-tests/src/test/scala/akka/pattern/BackoffSupervisorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/pattern/BackoffSupervisorSpec.scala @@ -350,7 +350,25 @@ class BackoffSupervisorSpec extends AkkaSpec with ImplicitSender with Eventually c1 ! PoisonPill expectTerminated(c1) expectTerminated(supervisor) + } + "supervisor must not stop when final stop message has not been received" in { + val stopMessage = "stop" + val supervisorWatcher = TestProbe() + val supervisor: ActorRef = create(onStopOptions(maxNrOfRetries = 100).withFinalStopMessage(_ == stopMessage)) + supervisor ! BackoffSupervisor.GetCurrentChild + val c1 = expectMsgType[BackoffSupervisor.CurrentChild].ref.get + watch(c1) + watch(supervisor) + supervisorWatcher.watch(supervisor) + + c1 ! PoisonPill + expectTerminated(c1) + supervisor ! "ping" + supervisorWatcher.expectNoMessage(20.millis) // supervisor must not terminate + + supervisor ! stopMessage + expectTerminated(supervisor) } } } diff --git a/akka-actor/src/main/scala/akka/pattern/BackoffSupervisor.scala b/akka-actor/src/main/scala/akka/pattern/BackoffSupervisor.scala index 30317b47c8..5480682291 100644 --- a/akka-actor/src/main/scala/akka/pattern/BackoffSupervisor.scala +++ b/akka-actor/src/main/scala/akka/pattern/BackoffSupervisor.scala @@ -436,8 +436,9 @@ private[akka] trait HandleBackoff { this: Actor ⇒ finalStopMessage match { case None ⇒ case Some(fsm) ⇒ - fsm(msg) - context.stop(self) + if (fsm(msg)) { + context.stop(self) + } } } }