连接所有的生命周期

把所有的事件放在一起,得到完整的生命周期。 只包含一个重启。

完整的生命周期

把所有的生命周期钩子函数放在一个actor内,我们可以看到不同事件发生的时机。

Listing 4.5 生命周期实例

    class LifeCycleHooks extends Actor
                    with ActorLogging{
        System.out.println("Constructor")
        override def preStart() {println("preStart")}
        override def
            postStop() {println("postStop")}
        override def
            preRestart(reason: Throwable,
        message: Option[Any]) {
            println("preRestart")
            super.preRestart (reason, message)
        }
        override def postRestart(reason: Throwable) {
            println("postRestart")
            super.postRestart(reason)
        }
        def
        receive = {
            case "restart" => throw
            new
            IllegalStateException("force restart")
            case msg: AnyRef
            => println("Receive")
        }
    }

接下来的“test”我们触发生命周期的三个事件。 休眠一段时间,确保我们能够看到postStop被调用。

Listing 4.6 测试生命周期实例

    val testActorRef = system.actorOf(
    Props[LifeCycleHooks], "LifeCycleHooks")
    testActorRef ! "restart"
    testActorRef.tell("msg", testActor)
    expectMsg("msg")
    system.stop(testActorRef)
    Thread.sleep(1000)

测试输出结果:

    Constructor
    Start event
    preStart
    preRestart force restart
    Restart event
    postStop
    Constructor
    postRestart force restart
    preStart
    Receive
    postStop
    Stop Event

每个actor都经过这个生命周期。 启动,可能重启几次,直到停止或者终止。 preStart 、preRestart 、postRestart 和 postStop 用来初始化、清理状态或者崩溃后控制、恢复其状态。