From e7c13253630c0c8c4361b66ebc16a5902a216397 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Fri, 1 Apr 2011 12:00:10 +0200 Subject: [PATCH] Adding Kill message, synonymous with Restart(new ActorKilledException(msg)) --- .../src/main/scala/akka/actor/Actor.scala | 3 +++ .../scala/akka/actor/actor/ActorRefSpec.scala | 27 +++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index e70b4a98ae..16dfbeba4a 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -61,6 +61,8 @@ case class UnlinkAndStop(child: ActorRef) extends AutoReceivedMessage with LifeC case object PoisonPill extends AutoReceivedMessage with LifeCycleMessage +case object Kill extends AutoReceivedMessage with LifeCycleMessage + case object ReceiveTimeout extends LifeCycleMessage case class MaximumNumberOfRestartsWithinTimeRangeReached( @@ -465,6 +467,7 @@ trait Actor { case Unlink(child) => self.unlink(child) case UnlinkAndStop(child) => self.unlink(child); child.stop case Restart(reason) => throw reason + case Kill => throw new ActorKilledException("Kill") case PoisonPill => val f = self.senderFuture self.stop diff --git a/akka-actor/src/test/scala/akka/actor/actor/ActorRefSpec.scala b/akka-actor/src/test/scala/akka/actor/actor/ActorRefSpec.scala index 2967bf8821..d379f3f98c 100644 --- a/akka-actor/src/test/scala/akka/actor/actor/ActorRefSpec.scala +++ b/akka-actor/src/test/scala/akka/actor/actor/ActorRefSpec.scala @@ -10,10 +10,10 @@ import org.scalatest.matchers.MustMatchers import akka.testing._ import akka.util.duration._ import akka.testing.Testing.sleepFor - +import akka.config.Supervision.{OneForOneStrategy} import akka.actor._ import akka.dispatch.Future - +import java.util.concurrent.{TimeUnit, CountDownLatch} object ActorRefSpec { @@ -123,5 +123,28 @@ class ActorRefSpec extends WordSpec with MustMatchers { ref.isRunning must be (false) ref.isShutdown must be (true) } + + "restart when Kill:ed" in { + val latch = new CountDownLatch(2) + + val boss = Actor.actorOf(new Actor{ + self.faultHandler = OneForOneStrategy(List(classOf[Throwable]), scala.Some(2), scala.Some(1000)) + + val ref = Actor.actorOf( + new Actor { + def receive = { case _ => } + override def preRestart(reason: Throwable) = latch.countDown + override def postRestart(reason: Throwable) = latch.countDown + } + ).start + + self link ref + + protected def receive = { case "sendKill" => ref ! Kill } + }).start + + boss ! "sendKill" + latch.await(5, TimeUnit.SECONDS) must be === true + } } }