Merge pull request #406 from akka/wip-2004-typed-context-√

Adding TypedActor.context for the lifecycle methods
This commit is contained in:
viktorklang 2012-04-24 02:00:13 -07:00
commit c62a34c67d
2 changed files with 34 additions and 19 deletions

View file

@ -19,6 +19,7 @@ import akka.dispatch.{ Await, Dispatchers, Future, Promise }
import akka.pattern.ask
import akka.serialization.JavaSerializer
import akka.actor.TypedActor._
import java.lang.IllegalStateException
object TypedActorSpec {
@ -162,20 +163,26 @@ object TypedActorSpec {
class LifeCyclesImpl(val latch: CountDownLatch) extends PreStart with PostStop with PreRestart with PostRestart with LifeCycles with Receiver {
private def ensureContextAvailable[T](f: T): T = TypedActor.context match {
case null throw new IllegalStateException("TypedActor.context is null!")
case some f
}
override def crash(): Unit = throw new IllegalStateException("Crash!")
override def preStart(): Unit = latch.countDown()
override def preStart(): Unit = ensureContextAvailable(latch.countDown())
override def postStop(): Unit = for (i 1 to 3) latch.countDown()
override def postStop(): Unit = ensureContextAvailable(for (i 1 to 3) latch.countDown())
override def preRestart(reason: Throwable, message: Option[Any]): Unit = for (i 1 to 5) latch.countDown()
override def preRestart(reason: Throwable, message: Option[Any]): Unit = ensureContextAvailable(for (i 1 to 5) latch.countDown())
override def postRestart(reason: Throwable): Unit = for (i 1 to 7) latch.countDown()
override def postRestart(reason: Throwable): Unit = ensureContextAvailable(for (i 1 to 7) latch.countDown())
override def onReceive(msg: Any, sender: ActorRef): Unit = {
msg match {
case "pigdog" sender ! "dogpig"
}
ensureContextAvailable(
msg match {
case "pigdog" sender ! "dogpig"
})
}
}
}

View file

@ -227,15 +227,19 @@ object TypedActor extends ExtensionId[TypedActorExtension] with ExtensionIdProvi
case _ super.supervisorStrategy
}
override def preStart(): Unit = me match {
case l: PreStart l.preStart()
case _ super.preStart()
override def preStart(): Unit = withContext {
me match {
case l: PreStart l.preStart()
case _ super.preStart()
}
}
override def postStop(): Unit = try {
me match {
case l: PostStop l.postStop()
case _ super.postStop()
withContext {
me match {
case l: PostStop l.postStop()
case _ super.postStop()
}
}
} finally {
TypedActor(context.system).invocationHandlerFor(proxyVar.get) match {
@ -246,14 +250,18 @@ object TypedActor extends ExtensionId[TypedActorExtension] with ExtensionIdProvi
}
}
override def preRestart(reason: Throwable, message: Option[Any]): Unit = me match {
case l: PreRestart l.preRestart(reason, message)
case _ super.preRestart(reason, message)
override def preRestart(reason: Throwable, message: Option[Any]): Unit = withContext {
me match {
case l: PreRestart l.preRestart(reason, message)
case _ super.preRestart(reason, message)
}
}
override def postRestart(reason: Throwable): Unit = me match {
case l: PostRestart l.postRestart(reason)
case _ super.postRestart(reason)
override def postRestart(reason: Throwable): Unit = withContext {
me match {
case l: PostRestart l.postRestart(reason)
case _ super.postRestart(reason)
}
}
protected def withContext[T](unitOfWork: T): T = {