检查Scala / Akka actor是否被终止

时间:2014-07-25 13:17:20

标签: scala akka actor

在一个actor中执行代码时,我需要检查actor是否还活着。 这是可取的还是有更好的方法?

if (self != akka.actor.DeadLetter) {
  // do something
}

谢谢!

EDIT ---

感谢您的所有投入。会发生什么是以下情况。我正在使用Play。当我的演员开始时,在传入请求时,会安排超时。

Promise.timeout({
     Logger.info(s"$self, timeout expired")
     // do something
}, timeoutValue)

有时在超时到期之前,actor会因其他原因而停止(例如,客户端断开连接)。在那种情况下,我在日志中看到的是

Actor[akka://application/deadLetters], timeout expired.

据我了解,这意味着默认的deadLetters actor正在执行该代码。所以我的问题是:在演员终止后检查Promise代码是否执行的最佳方法是什么,如果是这样的话,阻止它进一步发展?

3 个答案:

答案 0 :(得分:3)

您应该熟悉演员生命周期:http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Actor_Lifecycle

从actor内部你可以实现postStop()回调,该回调将在你的actor停止之前立即被调用。如果你想监视来自另一个actor的actor的生命周期,你应该使用DeathWatch:http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Lifecycle_Monitoring_aka_DeathWatch

答案 1 :(得分:0)

我认为你可以看到你的演员,如果你收到消息Terminated,你确定你的演员没有跑。

ActorContext.watch(self)

答案 2 :(得分:0)

如果你的演员死了,演员中的代码就不会运行。

您可以使用actorSelection检查特定参与者是否可用,然后向结果返回的内容发送消息(如果没有任何内容,则不会发送任何消息)。

ActorContext.actorSelection(<your-actor-name>) ! someMessage