我头上乱七八糟 避免中毒邮箱 http://doc.akka.io/docs/akka/2.4.2/general/supervision.html
然后新演员恢复处理其邮箱,这意味着 在着名的演员本身之外看不到重启 发生故障的消息不是例外 再加工。
我的情况:actor收到运行smth的“命令”。演员试图达到远程服务。服务不可用。抛出异常。我希望演员继续联系远程服务器。我不想演员跳过引起异常的输入命令。 恢复会帮助我强迫演员继续前进吗?
override val supervisorStrategy: SupervisorStrategy =
OneForOneStrategy(maxNrOfRetries = -1, withinTimeRange = 5.minutes) {
case _: RemoteServiceIsDownException => Resume
case _ => Stop
}
通过恢复,我的意思是重试导致引发异常的调用。我怀疑akka Resume 意味着保留actor实例,但不重试失败的调用
akka持久性是否意味着持久邮箱?
扩展第一个案例。演员试图达到远程服务。现在演员是执着的。 SupervisorStrategy迫使Actor继续联系远程服务。整个JVM关闭了。 Akka应用程序重新启动。演员恢复会不会累积到达远程服务?
akka持久性是否意味着至少一次语义?
演员收到消息。然后JVM崩溃了。父母会重新接收暗恋期间正在处理的消息吗?
答案 0 :(得分:1)
扩展我的评论:
Will Resume会帮助我强迫演员继续前进吗? ...通过Resume,我的意思是重试引发异常的调用。我怀疑akka Resume意味着保留actor实例,但不重试失败的调用
不,我不相信。在您的消息处理失败后,Resume
指令将使演员继续前进。然而,尝试重试消息的一种方法是实际使用Restart
并利用Actor
的{{1}}挂钩:
preRestart
当演员崩溃时,它将运行此挂钩并为您提供处理导致其失败的消息的机会。
akka持久性是否意味着持久的邮箱?
不一定,使用持久化actor只意味着actor的域事件,以及随后的内部状态是持久的,而不是它用于处理消息的邮箱。话虽这么说,可以很容易地实现一个持久的邮箱,见下文。
akka持久性是否意味着至少一次语义?
同样不一定,但工具包确实有一个名为override def preRestart(t: Throwable, msgBeforeFailure: Option[Any]): Unit = {
case t: RemoteServiceIsDownException if msgBeforeFailure.isDefined =>
self ! msgBeforeFailure.get
case _: =>
}
的特性,可以让你实现这个(和持久邮箱)!
请参阅http://doc.akka.io/docs/akka/current/scala/persistence.html#At-Least-Once_Delivery