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]),因此无需自己将其隐藏起来.是的,将它重新发送给自己是完全没问题的,但要注意与此结合使用的无限重启,因为你最有可能最终得到一条永不丢弃的消息.
| 归档时间: |
|
| 查看次数: |
3109 次 |
| 最近记录: |