在官方akka 2.0.4 docs中说:
actor重新启动只替换实际的actor对象;邮箱的内容不受重启影响, 所以在postRestart挂钩返回后,将继续处理消息。触发了该消息的消息 异常将不会再次收到。在重新启动时发送给actor的任何消息都将排队等候 像往常一样邮箱。
假设我有一条消息导致我的演员重新开始。它不再存在于邮箱中,因此它不会被将要占据它的角色处理。如果我希望这个消息由演员处理(假设在这种情况下顺序无关紧要),演员在重启时将消息发送给自己是不是一个坏主意?
一些(伪)代码显示我的意思:
class ResendingActor extends Actor {
var curMessage: Option[MyMessage] = None
def receive = {
case MyMessage(x) => {
curMessage = Some(MyMessage(x))
/* processing */
curMessage = None
}
}
override def preRestart(reason: Throwable, message: Option[Any]) {
curMessage match {
case Some(x) => self ! x
case None => ;
}
}
}
这样,在重新启动之前,actor未处理的消息被推送到新actor的队列末尾。
所以我的问题是:我有什么理由不这样做吗?
我唯一能想到的是,如果消息由于某种原因而导致格式错误,它将永远不会离开系统并导致演员定期重启......
答案 0 :(得分:16)
您已在preRestart中收到失败的消息(请参阅:消息:选项[任意]),因此无需自行存储。是的,将它重新发送给自己是完全没问题的,但要注意与此结合使用的无限重启,因为你很可能会得到一条永远不会被丢弃的消息。