检查 Scala / Akka actor 是否已终止。

9

在一个actor中执行代码时,我需要检查该actor是否仍然存活。这样做是否明智,或者有更好的方法?

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

谢谢!

编辑---

感谢您提供的所有意见。以下是发生的情况。我正在使用Play。当我的actor启动时,在收到请求后,会安排一个超时。

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

有时候,演员在超时到期之前因其他原因被停止(例如客户端断开连接)。在这种情况下,我在日志中看到的是:

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

据我理解,这意味着默认的deadLetters 演员正在执行该代码。那么我的问题是:最好的方法是什么,以检查 Promise 代码是否在演员终止后执行,并在这种情况下防止其继续执行?
3个回答

3

感谢您的回答。代码确实在DeadLetter actor中执行。我编辑了问题以提供更多背景信息。 - ticofab

1

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

ActorContext.watch(self)

我可以使用这些信息的方式是在演员中设置一些状态,并在我的if语句中检查该状态。if语句将在某个时候执行(它在Play Promise超时中)。如果有更清晰的方法,我宁愿使用它。 - ticofab
虽然watch是获取通知actor已停止的首选方式,但它无法帮助检测actor内部停止的事实。 - Endre Varga
能否解释一下什么是 ActorContext?谢谢。 - Wei Lin
@WeiLin:每个Actor内部都有一个类型为ActorContext且名为"context"的变量可用。因此,您始终可以定义context.watch(someActorRef),其中"someActorRef"是ActorRef类型的实例,以监视其他某个Actor。如果该特定Actor死亡,则会返回带有相应ActorRef的Terminated消息(在接收块中使用case Terminated(actorRef) => ...捕获它)。 - Stoecki

1
如果您的演员已经死亡,那么演员内部的任何代码都不会运行。
您可以使用actorSelection检查特定演员是否可用,然后将消息发送到返回的结果(如果没有任何内容,则不会发送消息)。
ActorContext.actorSelection(<your-actor-name>) ! someMessage

谢谢您的回答。您能看一下我对问题所做的修改吗?考虑到您提到了死亡演员中的代码问题,这样解释会更清楚明白。 - ticofab
嗨,Fabio :) 你可以尝试使用postStop为该actor做些什么,就像其他作者建议的那样(这是当actor终止时应调用的方法)。例如,向另一个(观察)actor发送一条消息,从而改变上下文?或者使用其他外部同步方式。 - Ashalynd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接