diff --git a/akka-actor-tests/src/test/scala/akka/pattern/PatternSpec.scala b/akka-actor-tests/src/test/scala/akka/pattern/PatternSpec.scala index 69297b743a..ce1b9db201 100644 --- a/akka-actor-tests/src/test/scala/akka/pattern/PatternSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/pattern/PatternSpec.scala @@ -26,7 +26,7 @@ class PatternSpec extends AkkaSpec { import PatternSpec._ - "pattern.stop" must { + "pattern.gracefulStop" must { "provide Future for stopping an actor" in { val target = system.actorOf(Props[TargetActor]) @@ -42,10 +42,10 @@ class PatternSpec extends AkkaSpec { "complete Future with ActorTimeoutException when actor not terminated within timeout" in { val target = system.actorOf(Props[TargetActor]) - target ! Work(200 millis) - val result = gracefulStop(target, 50 millis) + target ! Work(250 millis) + val result = gracefulStop(target, 10 millis) intercept[ActorTimeoutException] { - Await.result(result, 100 millis) + Await.result(result, 200 millis) } } } diff --git a/akka-actor/src/main/scala/akka/pattern/package.scala b/akka-actor/src/main/scala/akka/pattern/package.scala index eb24d9ae8e..728db960ed 100644 --- a/akka-actor/src/main/scala/akka/pattern/package.scala +++ b/akka-actor/src/main/scala/akka/pattern/package.scala @@ -32,9 +32,9 @@ package object pattern { */ def gracefulStop(target: ActorRef, timeout: Duration)(implicit system: ActorSystem): Future[Boolean] = { if (target.isTerminated) { - Promise.successful(true)(system.dispatcher) + Promise.successful(true) } else { - val result = Promise[Boolean]()(system.dispatcher) + val result = Promise[Boolean]() system.actorOf(Props(new Actor { // Terminated will be received when target has been stopped context watch target @@ -43,13 +43,13 @@ package object pattern { context setReceiveTimeout timeout def receive = { - case Terminated(a) ⇒ - result.complete(Right(true)) - system.stop(self) + case Terminated(a) if a == target ⇒ + result success true + context.stop(self) case ReceiveTimeout ⇒ - result.complete(Left( - new ActorTimeoutException("Failed to stop [%s] within [%s]".format(target.path, context.receiveTimeout)))) - system.stop(self) + result failure new ActorTimeoutException( + "Failed to stop [%s] within [%s]".format(target.path, context.receiveTimeout)) + context.stop(self) } })) result