我有一个接收Int并将结果累积到缓冲区的actor。有时候演员会抛出异常。在异常之后将缓冲区的先前状态恢复为actor的最佳方法是什么?
BR。
答案 0 :(得分:3)
为了控制发生的事情,您需要在父actor上设置主管策略。
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
case e: Exception => {
println(s"got exception ~ ${e.getMessage()}")
Resume // Or Continue, Escalate, Restart, Stop
}
}
如果你想处理异常然后恢复actor,那么你的处理程序将返回Resume
恢复时,演员状态保持不变。
答案 1 :(得分:2)
除了manub的答案,你还应该考虑分离
进入两个演员如下:
累积演员应该创建一个儿童演员。此子actor执行可能失败的作业,然后将其作业的结果作为消息发送回其父级。父actor接收作业的结果并进行累积,或者表示子actor失败的通知。这样,您可以使用各种监督策略重新启动失败的作业。
有关此类方法的详细信息,请参阅此答案Handling Faults in Akka actors
答案 2 :(得分:1)
为了能够恢复有状态演员的状态,你应该考虑 Akka Persistence 。您将需要一个持久存储(例如Cassandra或LevelDB)来保持状态,并且框架将处理为您恢复状态(假设您有foo ->>[Bar] { _ => bar }
)。
http://doc.akka.io/docs/akka/current/scala/persistence.html详细解释了如何实现这一目标。
答案 3 :(得分:1)
您可以将Supervisor策略设置为Resume。当您的Actor抛出异常时,Supervisor将处理异常,您的Actor将丢弃当前消息并转到下一个消息。 (较新版本的Akka允许您在同一条消息上设置最大退休数量)
如果相反,您希望您的Actor继续处理导致异常的消息,您可以使用try-catch-finally块。