Akka - 重新发送"破坏"消息

nie*_*aki 23 scala akka playframework

在官方的akka 2.0.4文档中,它说:

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 => ;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这样,在重新启动之前,actor未处理的消息被推送到新actor的队列末尾.

所以我的问题是:我有什么理由不这样做吗?

我唯一能想到的是,如果消息由于某种原因而变形,它将永远不会离开系统并导致演员经常重启...

Vik*_*ang 17

您已经在preRestart中收到了失败的消息(请参阅:message:Option [Any]),因此无需自己将其隐藏起来.是的,将它重新发送给自己是完全没问题的,但要注意与此结合使用的无限重启,因为你最有可能最终得到一条永不丢弃的消息.

  • 可以在preStart中转发邮件以保留原始发件人吗? (3认同)