0

Akka Java在这里。我有两个演员,ParentChild,其中前者是后者的父母。如果Child引发特定异常(例如 an UnrulyTeenagerExcepton),那么我正在寻找的行为如下:

  • 保存对抛出异常时Parent正在处理的消息的引用;Child然后
  • Child重新启动,并将持久化的消息“回放”到Child; 但
  • 如果这个保存 -> 重启 -> 重播循环发生了 3 次,并且Child抛出了UnrulyTeenagerException3 次,那么我们SupervisorStrategy.escalate()

迄今为止我最好的尝试:

// Groovy pseudo-code
class ChildFailureDecider extends Function<Throwable,Directive> {
    int maxRetries = 3
    int numRetries = 0

    @Override
    Directive apply(Throwable childFailure) {
        if(childFailure instanceof UnrulyTeenagerException) {
            numRetries++

            if(numRetries <= maxRetries) {
                // TODO: #1 How to persist the message that caused the ‘childFailure’?

                return SupervisorStrategy.restart()

                // TODO: #2 How to ‘play back’ the persisted message to Child?
            }
        }

        SupervisorStrategy.escalate()
    }
}

但正如您所看到的,我正在努力解决消息持久性和回放问题。有任何想法吗?非常感谢 Java 代码示例,Akka 足够强悍,无需学习 Scala 象形文字!

4

1 回答 1

1

Akka 持久性是关于以持久的方式(例如到磁盘或数据库)以持久的方式记录事件(与消息不同),以便如果您的整个应用程序终止(例如 JVM 崩溃或硬件故障),可以在重新启动时重建该参与者的状态。在您的情况下,您希望记住发送给单个演员的消息,并在该演员因故障重新启动时重新发送,所以我认为在这种情况下您不需要持久性 API。

当参与者抛出异常时,该异常会呈现给主管,但不会显示导致异常的消息。我认为没有一种内置的方法可以实现这一目标。监督者可以通过设置适当参数的监督策略来管理只重启 3 次的规则:http: //doc.akka.io/japi/akka/2.4-M3/akka/actor/OneForOneStrategy.html#OneForOneStrategy-int -scala.concurrent.duration.Duration-akka.japi.Function-

消息的重放需要由发送方处理。您可以通过让接收方在处理完消息后向发送方发送确认来实现至少一次语义,如果没有收到确认,则让发送方定期重试。有关更多信息,请参阅此问题:Akka 消息传递保证

抱歉缺少代码,但我使用的是 Scala API 而不是 Java。

于 2015-08-27T08:10:55.937 回答