diff --git a/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala index 84367f7ec0..fc7be182f7 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/TypedActorSpec.scala @@ -193,6 +193,9 @@ object TypedActorSpec { }) } } + + trait F { def f(pow: Boolean): Int } + class FI extends F { def f(pow: Boolean): Int = if (pow) throw new IllegalStateException("expected") else 1 } } @org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner]) @@ -351,6 +354,21 @@ class TypedActorSpec extends AkkaSpec(TypedActorSpec.config) } } + "be restarted on failure" in { + filterEvents(EventFilter[IllegalStateException]("expected")) { + val t = newFooBar(Duration(2, "s")) + intercept[IllegalStateException] { t.failingOptionPigdog() }.getMessage must be === "expected" + t.optionPigdog() must be === Some("Pigdog") + mustStop(t) + + val ta: F = TypedActor(system).typedActorOf(TypedProps[FI]()) + intercept[IllegalStateException] { ta.f(true) }.getMessage must be === "expected" + ta.f(false) must be === 1 + + mustStop(ta) + } + } + "be able to support stacked traits for the interface part" in { val t = newStacked() t.notOverriddenStacked must be("foobar") diff --git a/akka-actor/src/main/scala/akka/actor/TypedActor.scala b/akka-actor/src/main/scala/akka/actor/TypedActor.scala index e10e5350bc..69a3707f48 100644 --- a/akka-actor/src/main/scala/akka/actor/TypedActor.scala +++ b/akka-actor/src/main/scala/akka/actor/TypedActor.scala @@ -235,14 +235,7 @@ object TypedActor extends ExtensionId[TypedActorExtension] with ExtensionIdProvi * INTERNAL USE ONLY */ private[akka] class TypedActor[R <: AnyRef, T <: R](val proxyVar: AtomVar[R], createInstance: ⇒ T) extends Actor { - val me = try { - TypedActor.selfReference set proxyVar.get - TypedActor.currentContext set context - createInstance - } finally { - TypedActor.selfReference set null - TypedActor.currentContext set null - } + val me = withContext[T](createInstance) override def supervisorStrategy(): SupervisorStrategy = me match { case l: Supervisor ⇒ l.supervisorStrategy @@ -275,7 +268,7 @@ object TypedActor extends ExtensionId[TypedActorExtension] with ExtensionIdProvi override def preRestart(reason: Throwable, message: Option[Any]): Unit = withContext { me match { case l: PreRestart ⇒ l.preRestart(reason, message) - case _ ⇒ super.preRestart(reason, message) + case _ ⇒ context.children foreach context.stop //Can't be super.preRestart(reason, message) since that would invoke postStop which would set the actorVar to DL and proxyVar to null } }