异常后恢复先前的actor状态

时间:2016-03-16 16:11:03

标签: scala akka actor

我有一个接收Int并将结果累积到缓冲区的actor。有时候演员会抛出异常。在异常之后将缓冲区的先前状态恢复为actor的最佳方法是什么?

BR。

4 个答案:

答案 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块。