理论教育 Scala语言基础与开发实战-终止Actor

Scala语言基础与开发实战-终止Actor

时间:2023-11-24 理论教育 版权反馈
【摘要】:在某些情况下,需要终止Actor并重新启动,以使Actor状态一致。通常context用来终止子Actor,而system用来终止顶级Actor。实际的终止操作是异步执行的,因此stop可能在Actor被终止之前返回。Actor的终止分为两步:第一步,Actor停止对邮箱的处理,向所有子Actor发送终止命令,然后处理子Actor的终止消息,直到所有的子Actor都完成终止。这个过程保证Actor系统中的子树以一种有序的方式终止,将终止命令传播到叶子结点并收集它们回送的确认消息。

Scala语言基础与开发实战-终止Actor

在某些情况下,需要终止Actor并重新启动,以使Actor状态一致。可以通过调用Actor⁃RefFactory或ActorContext或ActorSystem的stop方法来终止一个Actor。通常context用来终止子Actor,而system用来终止顶级Actor。实际的终止操作是异步执行的,因此stop可能在Actor被终止之前返回。如果当前有正在处理的消息,对该消息的处理将在Actor被终止之前完成,邮箱中的后续消息将不会被处理,默认情况下这些消息会被送到ActorSystem的死信中,但这也取决于邮箱的实现。

Actor的终止分为两步:第一步,Actor停止对邮箱的处理,向所有子Actor发送终止命令,然后处理子Actor的终止消息,直到所有的子Actor都完成终止。第二步,终止自己(调用postStop,销毁邮箱,向DeathWatch发布Terminated,通知其监管者)。这个过程保证Actor系统中的子树以一种有序的方式终止,将终止命令传播到叶子结点并收集它们回送的确认消息。如果其中某个Actor没有响应(例如,由于处理消息用了太长时间,以至于没有收到终止命令),整个过程将会被阻塞。

ActorSystem.shutdown被调用时,系统根监管Actor会被终止,以上过程将保证整个系统的正确终止。postStop回调函数是在Actor被完全终止以后调用的,以释放占用的资源。(www.daowen.com)

除了使用stop方法终止Actor外,还可以向Actor发送akka.actor.PoisonPill消息,这个消息处理完成后Actor会被终止。PoisonPill与普通消息一样被放进队列,因此会在已经进入队列的其他消息之后被执行

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈