From 7b263365aab863cdb44635d3780acf7f61edd72b Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 31 Mar 2013 03:04:12 +0200 Subject: [PATCH] #3077 - Deprecating ActorRef.isTerminated --- .../akka/serialization/SerializeSpec.scala | 12 ++++---- .../src/main/scala/akka/actor/ActorRef.scala | 14 +++++++--- .../scala/akka/actor/ActorRefProvider.scala | 2 +- .../src/main/scala/akka/actor/FSM.scala | 4 +-- .../akka/actor/RepointableActorRef.scala | 2 +- .../main/scala/akka/pattern/AskSupport.scala | 2 +- .../dispatcher/DispatcherDocTestBase.java | 28 ++++++++++--------- .../jrouting/RouterViaProgramDocTestBase.java | 23 ++++++--------- .../docs/actor/FaultHandlingDocSpec.scala | 5 +--- .../docs/dispatcher/DispatcherDocSpec.scala | 5 ++-- .../routing/RouterViaProgramDocSpec.scala | 26 ++++++++--------- .../akka/remote/RemoteActorRefProvider.scala | 2 +- 12 files changed, 61 insertions(+), 64 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala b/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala index ad351e4fff..07b4065e3c 100644 --- a/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/serialization/SerializeSpec.scala @@ -348,23 +348,23 @@ class SerializationCompatibilitySpec extends AkkaSpec(SerializationTests.mostlyR verify(Terminate(), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001e616b6b612e64697370617463682e7379736d73672e5465726d696e61746509d66ca68318700f02000078707671007e0003") } "be preserved for the Supervise SystemMessage" in { - verify(Supervise(FakeActorRef("child"), true), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001e616b6b612e64697370617463682e7379736d73672e5375706572766973652d0b363f56ab5feb0200025a00056173796e634c00056368696c647400154c616b6b612f6163746f722f4163746f725265663b7870017372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566db6eaed9e69a356302000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f469402000078707400056368696c647671007e0003") + verify(Supervise(FakeActorRef("child"), true), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001e616b6b612e64697370617463682e7379736d73672e5375706572766973652d0b363f56ab5feb0200025a00056173796e634c00056368696c647400154c616b6b612f6163746f722f4163746f725265663b7870017372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566869e6c3669e60e5f02000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f469402000078707400056368696c647671007e0003") } "be preserved for the ChildTerminated SystemMessage" in { - verify(ChildTerminated(FakeActorRef("child")), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e0001787073720024616b6b612e64697370617463682e7379736d73672e4368696c645465726d696e617465644c84222437ed5db40200014c00056368696c647400154c616b6b612f6163746f722f4163746f725265663b78707372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566db6eaed9e69a356302000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f469402000078707400056368696c647671007e0003") + verify(ChildTerminated(FakeActorRef("child")), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e0001787073720024616b6b612e64697370617463682e7379736d73672e4368696c645465726d696e617465644c84222437ed5db40200014c00056368696c647400154c616b6b612f6163746f722f4163746f725265663b78707372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566869e6c3669e60e5f02000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f469402000078707400056368696c647671007e0003") } "be preserved for the Watch SystemMessage" in { - verify(Watch(FakeActorRef("watchee"), FakeActorRef("watcher")), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001a616b6b612e64697370617463682e7379736d73672e57617463682e1e65bc74394fc40200024c0007776174636865657400154c616b6b612f6163746f722f4163746f725265663b4c00077761746368657271007e000478707372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566db6eaed9e69a356302000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f46940200007870740007776174636865657371007e0006740007776174636865727671007e0003") + verify(Watch(FakeActorRef("watchee"), FakeActorRef("watcher")), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001a616b6b612e64697370617463682e7379736d73672e57617463682e1e65bc74394fc40200024c0007776174636865657400154c616b6b612f6163746f722f4163746f725265663b4c00077761746368657271007e000478707372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566869e6c3669e60e5f02000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f46940200007870740007776174636865657371007e0006740007776174636865727671007e0003") } "be preserved for the Unwatch SystemMessage" in { - verify(Unwatch(FakeActorRef("watchee"), FakeActorRef("watcher")), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001c616b6b612e64697370617463682e7379736d73672e556e776174636858501f7ee63dc2100200024c0007776174636865657400154c616b6b612f6163746f722f4163746f725265663b4c00077761746368657271007e000478707372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566db6eaed9e69a356302000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f46940200007870740007776174636865657371007e0006740007776174636865727671007e0003") + verify(Unwatch(FakeActorRef("watchee"), FakeActorRef("watcher")), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001c616b6b612e64697370617463682e7379736d73672e556e776174636858501f7ee63dc2100200024c0007776174636865657400154c616b6b612f6163746f722f4163746f725265663b4c00077761746368657271007e000478707372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566869e6c3669e60e5f02000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f46940200007870740007776174636865657371007e0006740007776174636865727671007e0003") } "be preserved for the NoMessage SystemMessage" in { verify(NoMessage, "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001f616b6b612e64697370617463682e7379736d73672e4e6f4d65737361676524b401a3610ccb70dd02000078707671007e0003") } "be preserved for the Failed SystemMessage" in { // Using null as the cause to avoid a large serialized message - verify(Failed(FakeActorRef("child"), cause = null, uid = 0), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001b616b6b612e64697370617463682e7379736d73672e4661696c656400000000000000030200034900037569644c000563617573657400154c6a6176612f6c616e672f5468726f7761626c653b4c00056368696c647400154c616b6b612f6163746f722f4163746f725265663b787000000000707372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566db6eaed9e69a356302000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f469402000078707400056368696c647671007e0003") + verify(Failed(FakeActorRef("child"), cause = null, uid = 0), "aced00057372000c7363616c612e5475706c6532bc7daadf46211a990200024c00025f317400124c6a6176612f6c616e672f4f626a6563743b4c00025f3271007e000178707372001b616b6b612e64697370617463682e7379736d73672e4661696c656400000000000000030200034900037569644c000563617573657400154c6a6176612f6c616e672f5468726f7761626c653b4c00056368696c647400154c616b6b612f6163746f722f4163746f725265663b787000000000707372001f616b6b612e73657269616c697a6174696f6e2e46616b654163746f7252656600000000000000010200014c00046e616d657400124c6a6176612f6c616e672f537472696e673b7872001b616b6b612e6163746f722e496e7465726e616c4163746f72526566869e6c3669e60e5f02000078720013616b6b612e6163746f722e4163746f72526566c3585dde655f469402000078707400056368696c647671007e0003") } } } @@ -411,7 +411,7 @@ protected[akka] case class FakeThrowable(msg: String) extends Throwable(msg) wit protected[akka] case class FakeActorRef(name: String) extends InternalActorRef with ActorRefScope { override def path = RootActorPath(Address("proto", "SomeSystem"), name) override def forward(message: Any)(implicit context: ActorContext) = ??? - override def isTerminated = ??? + @deprecated("Use context.watch(actor) and receive Terminated(actor)", "2.2") override def isTerminated = ??? override def start() = ??? override def resume(causedByFailure: Throwable) = ??? override def suspend() = ??? diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index adf945d6b8..85f92b91c1 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -133,7 +133,7 @@ abstract class ActorRef extends java.lang.Comparable[ActorRef] with Serializable * The contract is that if this method returns true, then it will never be false again. * But you cannot rely on that it is alive if it returns false, since this by nature is a racy method. */ - def isTerminated: Boolean + @deprecated("Use context.watch(actor) and receive Terminated(actor)", "2.2") def isTerminated: Boolean final override def hashCode: Int = { if (path.uid == ActorCell.undefinedUid) path.hashCode @@ -247,6 +247,12 @@ private[akka] abstract class InternalActorRef extends ActorRef with ScalaActorRe * i.e. whose mailbox is directly reachable etc. */ def isLocal: Boolean + + /** + * Returns “true” if the actor is locally known to be terminated, “false” if + * alive or uncertain. + */ + def isTerminated: Boolean } /** @@ -302,7 +308,7 @@ private[akka] class LocalActorRef private[akka] ( * If this method returns true, it will never return false again, but if it * returns false, you cannot be sure if it's alive still (race condition) */ - override def isTerminated: Boolean = actorCell.isTerminated + @deprecated("Use context.watch(actor) and receive Terminated(actor)", "2.2") override def isTerminated: Boolean = actorCell.isTerminated /** * Starts the actor after initialization. @@ -428,7 +434,7 @@ private[akka] trait MinimalActorRef extends InternalActorRef with LocalRef { override def suspend(): Unit = () override def resume(causedByFailure: Throwable): Unit = () override def stop(): Unit = () - override def isTerminated = false + @deprecated("Use context.watch(actor) and receive Terminated(actor)", "2.2") override def isTerminated = false override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = () @@ -469,7 +475,7 @@ private[akka] class EmptyLocalActorRef(override val provider: ActorRefProvider, override val path: ActorPath, val eventStream: EventStream) extends MinimalActorRef { - override def isTerminated: Boolean = true + @deprecated("Use context.watch(actor) and receive Terminated(actor)", "2.2") override def isTerminated(): Boolean = true override def sendSystemMessage(message: SystemMessage): Unit = { if (Mailbox.debug) println(s"ELAR $path having enqueued $message") diff --git a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala index e4aa58f235..e03f40bc38 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRefProvider.scala @@ -386,7 +386,7 @@ private[akka] class LocalActorRefProvider private[akka] ( def provider: ActorRefProvider = LocalActorRefProvider.this override def stop(): Unit = stopped switchOn { terminationPromise.complete(causeOfTermination.map(Failure(_)).getOrElse(Success(()))) } - override def isTerminated: Boolean = stopped.isOn + @deprecated("Use context.watch(actor) and receive Terminated(actor)", "2.2") override def isTerminated: Boolean = stopped.isOn override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = stopped.ifOff(message match { case null ⇒ throw new InvalidMessageException("Message is null") diff --git a/akka-actor/src/main/scala/akka/actor/FSM.scala b/akka-actor/src/main/scala/akka/actor/FSM.scala index 99f75dbaea..348c91d65d 100644 --- a/akka-actor/src/main/scala/akka/actor/FSM.scala +++ b/akka-actor/src/main/scala/akka/actor/FSM.scala @@ -553,12 +553,12 @@ trait FSM[S, D] extends Listeners with ActorLogging { processMsg(msg, t) } case SubscribeTransitionCallBack(actorRef) ⇒ - // TODO use DeathWatch to clean up list + // TODO Use context.watch(actor) and receive Terminated(actor) to clean up list listeners.add(actorRef) // send current state back as reference point actorRef ! CurrentState(self, currentState.stateName) case Listen(actorRef) ⇒ - // TODO use DeathWatch to clean up list + // TODO Use context.watch(actor) and receive Terminated(actor) to clean up list listeners.add(actorRef) // send current state back as reference point actorRef ! CurrentState(self, currentState.stateName) diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 9ce7169be3..37ec3af662 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -129,7 +129,7 @@ private[akka] class RepointableActorRef( case _ ⇒ true } - def isTerminated: Boolean = underlying.isTerminated + @deprecated("Use context.watch(actor) and receive Terminated(actor)", "2.2") def isTerminated: Boolean = underlying.isTerminated def provider: ActorRefProvider = system.provider diff --git a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala index 7905acbea3..a34cbf972a 100644 --- a/akka-actor/src/main/scala/akka/pattern/AskSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/AskSupport.scala @@ -215,7 +215,7 @@ private[akka] final class PromiseActorRef private (val provider: ActorRefProvide case _ ⇒ } - override def isTerminated: Boolean = state match { + @deprecated("Use context.watch(actor) and receive Terminated(actor)", "2.2") override def isTerminated: Boolean = state match { case Stopped | _: StoppedWithPath ⇒ true case _ ⇒ false } diff --git a/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java b/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java index 2a6f6a88fe..6259d9a9aa 100644 --- a/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java +++ b/akka-docs/rst/java/code/docs/dispatcher/DispatcherDocTestBase.java @@ -16,6 +16,7 @@ import akka.event.LoggingAdapter; //#imports-prio-mailbox import akka.dispatch.PriorityGenerator; import akka.dispatch.UnboundedPriorityMailbox; +import akka.testkit.JavaTestKit; import com.typesafe.config.Config; //#imports-prio-mailbox @@ -83,6 +84,7 @@ public class DispatcherDocTestBase { @Test public void priorityDispatcher() throws Exception { + JavaTestKit probe = new JavaTestKit(system); //#prio-dispatcher // We create a new Actor that just prints out what it processes @@ -93,14 +95,17 @@ public class DispatcherDocTestBase { LoggingAdapter log = Logging.getLogger(getContext().system(), this); { - getSelf().tell("lowpriority", getSelf()); - getSelf().tell("lowpriority", getSelf()); - getSelf().tell("highpriority", getSelf()); - getSelf().tell("pigdog", getSelf()); - getSelf().tell("pigdog2", getSelf()); - getSelf().tell("pigdog3", getSelf()); - getSelf().tell("highpriority", getSelf()); - getSelf().tell(PoisonPill.getInstance(), getSelf()); + for(Object msg : new Object[] { + "lowpriority", + "lowpriority", + "highpriority", + "pigdog", + "pigdog2", + "pigdog3", + "highpriority", + PoisonPill.getInstance() }) { + getSelf().tell(msg, getSelf()); + } } public void onReceive(Object message) { @@ -122,11 +127,8 @@ public class DispatcherDocTestBase { */ //#prio-dispatcher - for (int i = 0; i < 10; i++) { - if (myActor.isTerminated()) - break; - Thread.sleep(100); - } + probe.watch(myActor); + probe.expectMsgClass(Terminated.class); } static diff --git a/akka-docs/rst/java/code/docs/jrouting/RouterViaProgramDocTestBase.java b/akka-docs/rst/java/code/docs/jrouting/RouterViaProgramDocTestBase.java index ece75496a4..db7f1f024a 100644 --- a/akka-docs/rst/java/code/docs/jrouting/RouterViaProgramDocTestBase.java +++ b/akka-docs/rst/java/code/docs/jrouting/RouterViaProgramDocTestBase.java @@ -3,12 +3,7 @@ */ package docs.jrouting; -import akka.actor.ActorRef; -import akka.actor.ActorSystem; -import akka.actor.Kill; -import akka.actor.PoisonPill; -import akka.actor.Props; -import akka.actor.UntypedActor; +import akka.actor.*; import akka.remote.routing.RemoteRouterConfig; import akka.routing.Broadcast; import akka.routing.RoundRobinRouter; @@ -83,11 +78,11 @@ public class RouterViaProgramDocTestBase { public void demonstratePoisonPill() { new JavaTestKitWithSelf(system) {{ ActorRef router = system.actorOf(new Props(Echo.class).withRouter(new RoundRobinRouter(5))); + watch(router); //#poisonPill router.tell(PoisonPill.getInstance(), getSelf()); //#poisonPill - expectNoMsg(duration("1 seconds")); - Assert.assertTrue(router.isTerminated()); + expectMsgClass(Terminated.class); }}; } @@ -95,11 +90,11 @@ public class RouterViaProgramDocTestBase { public void demonstrateBroadcastOfPoisonPill() { new JavaTestKitWithSelf(system) {{ ActorRef router = system.actorOf(new Props(Echo.class).withRouter(new RoundRobinRouter(5))); + watch(router); //#broadcastPoisonPill router.tell(new Broadcast(PoisonPill.getInstance()), getSelf()); //#broadcastPoisonPill - expectNoMsg(duration("1 seconds")); - Assert.assertTrue(router.isTerminated()); + expectMsgClass(Terminated.class); }}; } @@ -107,11 +102,11 @@ public class RouterViaProgramDocTestBase { public void demonstrateKill() { new JavaTestKitWithSelf(system) {{ ActorRef router = system.actorOf(new Props(Echo.class).withRouter(new RoundRobinRouter(5))); + watch(router); //#kill router.tell(Kill.getInstance(), getSelf()); //#kill - expectNoMsg(duration("1 seconds")); - Assert.assertTrue(router.isTerminated()); + expectMsgClass(Terminated.class); }}; } @@ -119,11 +114,11 @@ public class RouterViaProgramDocTestBase { public void demonstrateBroadcastOfKill() { new JavaTestKitWithSelf(system) {{ ActorRef router = system.actorOf(new Props(Echo.class).withRouter(new RoundRobinRouter(5))); + watch(router); //#broadcastKill router.tell(new Broadcast(Kill.getInstance()), getSelf()); //#broadcastKill - expectNoMsg(duration("1 seconds")); - Assert.assertTrue(router.isTerminated()); + expectMsgClass(Terminated.class); }}; } diff --git a/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSpec.scala b/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSpec.scala index fe1e5b87de..a85d016ba2 100644 --- a/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/actor/FaultHandlingDocSpec.scala @@ -115,10 +115,7 @@ class FaultHandlingDocSpec extends AkkaSpec with ImplicitSender { //#stop watch(child) // have testActor watch “child” child ! new IllegalArgumentException // break it - expectMsgPF() { - case t @ Terminated(`child`) if t.existenceConfirmed ⇒ () - } - child.isTerminated must be(true) + expectMsgPF() { case Terminated(`child`) ⇒ () } //#stop } EventFilter[Exception]("CRASH", occurrences = 2) intercept { diff --git a/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala b/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala index 55d7e71249..b4a92e261a 100644 --- a/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/dispatcher/DispatcherDocSpec.scala @@ -11,7 +11,7 @@ import akka.testkit.AkkaSpec import akka.event.Logging import akka.event.LoggingAdapter import scala.concurrent.duration._ -import akka.actor.{ Props, Actor, PoisonPill, ActorSystem } +import akka.actor._ object DispatcherDocSpec { val config = """ @@ -227,7 +227,8 @@ class DispatcherDocSpec extends AkkaSpec(DispatcherDocSpec.config) { */ //#prio-dispatcher - awaitCond(a.isTerminated, 5 seconds) + watch(a) + expectMsgPF() { case Terminated(`a`) ⇒ () } } "defining balancing dispatcher" in { diff --git a/akka-docs/rst/scala/code/docs/routing/RouterViaProgramDocSpec.scala b/akka-docs/rst/scala/code/docs/routing/RouterViaProgramDocSpec.scala index 342186f0c9..0d75763a94 100644 --- a/akka-docs/rst/scala/code/docs/routing/RouterViaProgramDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/routing/RouterViaProgramDocSpec.scala @@ -3,7 +3,7 @@ */ package docs.routing -import akka.actor.{ Actor, ActorRef, ActorSystem, Props, ActorLogging } +import akka.actor._ import akka.routing.ConsistentHashingRouter.ConsistentHashable import akka.routing.FromConfig import akka.routing.RoundRobinRouter @@ -37,8 +37,8 @@ class RouterViaProgramDocSpec extends AkkaSpec with ImplicitSender { val actor2 = system.actorOf(Props[ExampleActor1], "actor2") val actor3 = system.actorOf(Props[ExampleActor1], "actor3") val routees = Vector[String]("/user/actor1", "/user/actor2", "/user/actor3") - val router = system.actorOf(Props().withRouter( - RoundRobinRouter(routees = routees))) + val router = system.actorOf( + Props().withRouter(RoundRobinRouter(routees = routees))) //#programmaticRoutingRouteePaths 1 to 6 foreach { i ⇒ router ! Message1(i) } val received = receiveN(6, 5.seconds.dilated) @@ -59,45 +59,41 @@ class RouterViaProgramDocSpec extends AkkaSpec with ImplicitSender { } "demonstrate PoisonPill" in { - val router = system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5))) + val router = watch(system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5)))) //#poisonPill import akka.actor.PoisonPill router ! PoisonPill //#poisonPill - expectNoMsg(1.seconds.dilated) - router.isTerminated must be(true) + expectMsgPF() { case Terminated(`router`) ⇒ () } } "demonstrate broadcast of PoisonPill" in { - val router = system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5))) + val router = watch(system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5)))) //#broadcastPoisonPill import akka.actor.PoisonPill import akka.routing.Broadcast router ! Broadcast(PoisonPill) //#broadcastPoisonPill - expectNoMsg(1.seconds.dilated) - router.isTerminated must be(true) + expectMsgPF() { case Terminated(`router`) ⇒ () } } "demonstrate Kill" in { - val router = system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5))) + val router = watch(system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5)))) //#kill import akka.actor.Kill router ! Kill //#kill - expectNoMsg(1.seconds.dilated) - router.isTerminated must be(true) + expectMsgPF() { case Terminated(`router`) ⇒ () } } "demonstrate broadcast of Kill" in { - val router = system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5))) + val router = watch(system.actorOf(Props[Echo].withRouter(RoundRobinRouter(nrOfInstances = 5)))) //#broadcastKill import akka.actor.Kill import akka.routing.Broadcast router ! Broadcast(Kill) //#broadcastKill - expectNoMsg(1.seconds.dilated) - router.isTerminated must be(true) + expectMsgPF() { case Terminated(`router`) ⇒ () } } } diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index f9521bebda..0d3023909b 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -356,7 +356,7 @@ private[akka] class RemoteActorRef private[akka] ( } } - def isTerminated: Boolean = false + @deprecated("Use context.watch(actor) and receive Terminated(actor)", "2.2") override def isTerminated: Boolean = false private def handleException: Catcher[Unit] = { case e: InterruptedException ⇒