繁体   English   中英

在Akka中重新启动的参与者的消息持久性和回放

[英]Message Persistence and Playback with restarted actors in Akka

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

  • Parent保存到这是一个由处理的消息的引用Child时抛出异常; 然后
  • Child被重新启动,将持续的消息“回放”给Child ;
  • 如果此保存->重新启动->重播周期发生了3次,并且Child抛出了3次UnrulyTeenagerException我们可以通过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象形文字!

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM