检查是否终止了Scala/Akka参与者

检查是否终止了Scala/Akka参与者,scala,akka,actor,Scala,Akka,Actor,在一个参与者内执行代码时,我需要检查该参与者是否仍然活着。 这是明智的还是有更好的办法 if (self != akka.actor.DeadLetter) { // do something } 谢谢 编辑--- 谢谢你的投入。发生的情况如下。我在玩游戏。当我的参与者启动时,根据传入的请求,会安排一个超时 Promise.timeout({ Logger.info(s"$self, timeout expired") // do something }, timeou

在一个参与者内执行代码时,我需要检查该参与者是否仍然活着。 这是明智的还是有更好的办法

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

编辑---

谢谢你的投入。发生的情况如下。我在玩游戏。当我的参与者启动时,根据传入的请求,会安排一个超时

Promise.timeout({
     Logger.info(s"$self, timeout expired")
     // do something
}, timeoutValue)
有时,在超时过期之前,由于其他原因(例如,客户端断开连接),参与者会停止。在这种情况下,我在日志中看到的是

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

据我所知,这意味着默认的
deadLetters
actor正在执行该代码。所以我的问题是:检查承诺代码是否在参与者终止后执行的最好方法是什么,如果是这种情况,防止它进一步执行

我认为您可以观看您的演员,如果您收到消息
终止
,您可以确定您的演员没有在运行

ActorContext.watch(self)

如果您的参与者已死亡,那么参与者中的任何代码都不会运行

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

ActorContext.actorSelection()!消息

您应该熟悉参与者生命周期:


从actor内部可以实现postStop()回调,该回调将在actor停止之前立即调用。如果您想从另一个参与者监控参与者的生命周期,您应该使用DeathWatch:

我可以使用此信息的方式是在参与者中设置一些状态,并在If语句中检查这些状态。if语句将在某个时刻执行(它处于播放承诺超时)。如果有的话,我宁愿使用更干净的方式。虽然手表是当演员被停止时获得通知的首选方式,但它无助于检测演员内部停止的事实。你能解释一下什么是
ActorContext
?Thanks@WeiLin:ActorContext类型和名称为“context”的变量在每个参与者中都可用。因此,您可以始终定义context.watch(someActorRef),其中“someActorRef”是ActorRef类型的实例,用于监视其他参与者。如果该特定参与者死亡,将返回一条带有相应ActorRef的终止消息(在接收块中用
case Terminated(ActorRef)=>…
捕获该消息,感谢您的回答。您能看一下我的问题编辑吗?考虑到您关于死亡参与者中代码的评论,它能更好地解释问题。您好,Fabio:)正如另一位作者所建议的,您可以尝试对该参与者的postStop做一些事情(这是当参与者终止时应该调用的方法)。例如,向另一个(正在观看的)参与者发送消息,这会改变上下文吗?或者使用其他外部同步。谢谢您的回答。代码确实是在死信参与者中执行的。我编辑了这个问题以提供更多的上下文。
ActorContext.actorSelection(<your-actor-name>) ! someMessage