阿卡 - 重新发送"打破"信息

时间:2012-11-24 16:07:28

标签: scala playframework akka

在官方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的队列末尾。

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

我唯一能想到的是,如果消息由于某种原因而导致格式错误,它将永远不会离开系统并导致演员定期重启......

1 个答案:

答案 0 :(得分:16)

您已在preRestart中收到失败的消息(请参阅:消息:选项[任意]),因此无需自行存储。是的,将它重新发送给自己是完全没问题的,但要注意与此结合使用的无限重启,因为你很可能会得到一条永远不会被丢弃的消息。