Scala 在异常后恢复以前的参与者状态

Scala 在异常后恢复以前的参与者状态,scala,akka,actor,Scala,Akka,Actor,我有一个actor,它接收Int并将结果累积到缓冲区。有时,演员可以抛出异常。异常后将缓冲区的先前状态恢复到actor中的最佳方法是什么 比尔 > P>为了恢复状态演员的状态,你应该考虑 AkkA持久性。您将需要一个持久存储(例如Cassandra或LevelDB)来持久化状态,并且框架将为您处理恢复状态的操作(前提是您有一个持久化器) 详细解释了如何做到这一点。 < P>除了Maunb的回答之外,还应该考虑分离 累积该值的部分,以及 可能失败的部分 分为以下两个方面: 累积的参与者应该创建

我有一个actor,它接收Int并将结果累积到缓冲区。有时,演员可以抛出异常。异常后将缓冲区的先前状态恢复到actor中的最佳方法是什么


比尔

> P>为了恢复状态演员的状态,你应该考虑<强> AkkA持久性<强>。您将需要一个持久存储(例如Cassandra或LevelDB)来持久化状态,并且框架将为您处理恢复状态的操作(前提是您有一个
持久化器


详细解释了如何做到这一点。

< P>除了Maunb的回答之外,还应该考虑分离

  • 累积该值的部分,以及
  • 可能失败的部分
分为以下两个方面:

累积的参与者应该创建一个子参与者。此子参与者执行可能失败的作业,然后将其作业的结果作为消息发送回其父级。父参与者接收作业的结果并执行累积操作,或者发出子参与者失败的通知。例如,通过这种方式,您可以使用各种监控策略重新启动失败的作业


有关这种方法的更多信息,请参见此答案,例如,为了控制发生的情况,您需要在父参与者上设置主管策略

override val supervisorStrategy =
  OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
    case e: Exception                => {
      println(s"got exception ~ ${e.getMessage()}")
      Resume // Or Continue, Escalate, Restart, Stop
    }
  }
如果您希望处理异常,则恢复参与者,然后处理程序将返回resume


恢复时,参与者状态保持不变。

您可以将主管策略设置为恢复。当您的参与者抛出异常时,主管将处理该异常,您的参与者将丢弃当前消息并继续下一条消息。(Akka的较新版本允许您在同一条消息上设置最大退休人数)

相反,如果希望参与者继续处理导致异常的消息,则可以使用try-catch-finally块