当前位置: 首页 > 知识库问答 >
问题:

带后退和重试限制的演员重试

仉姚石
2023-03-14

我需要在akka演员重试机制与增加时间之间的重试和最大重试限制。为此,我尝试使用AKKA提供的BackOffSupervisor模式。问题是,从我的测试来看,后退策略和重试限制似乎不起作用。又或者问题出在测试上?

class SomeActor extends AbstractActor {

private static int messageCounter = 0;

//return the message to sender
@Override
public void preRestart(final Throwable reason, final Optional<Object> message) {
    getSelf().tell(message.get(), getSender());
}


@Override
public Receive createReceive() {
    return receiveBuilder()
            .matchEquals("hello", message -> {
                messageCounter++;
                getSender().tell("response", getSelf());

                //Throw Exception at the first 5 messages
                if (messageCounter < 5) {
                    throw new Exception();
                }

            })
            .build();
}
private ActorRef createSupervisedActor(Class<? extends Actor> actorClass) {
    final Props someActorProps = Props.create(actorClass);

    final Props supervisorProps = BackoffSupervisor.props(
            Backoff.onStop(
                    someActorProps, //actor to be supervised
                    "someActor",
                    Duration.ofSeconds(10), //min back-off time
                    Duration.ofMinutes(2), // max back-off time
                    0.2, // back-off increase factor
                    10) // max retry limit
                    .withSupervisorStrategy(
                            new OneForOneStrategy(
                                    DeciderBuilder
                                            .match(Exception.class, e -> SupervisorStrategy.restart())
                                            .matchAny(o -> SupervisorStrategy.escalate())
                                            .build())
                    )
    );

    return testSystem.actorOf(supervisorProps);

}

和试验方法

    @Test
public void test() {
    new TestKit(testSystem) {{
        ActorRef actorRef = createSupervisedActor(SomeActor.class);

        actorRef.tell("hello", getRef());

        //Expect 5 responses in 1 second
        receiveN(5, Duration.ofSeconds(1));
    }};

}

测试结束得太快了。在不到一秒钟的时间里,从BackoffSupervisor的配置来看,我预计至少需要50多秒。

共有1个答案

微生毅
2023-03-14

问题是由于以下原因造成的:

在子actor(在我的例子中是someActor)中抛出异常不由backoff.onstop处理,因此由正常的默认监督处理,这意味着立即重新启动。-https://github.com/akka/akka/issues/23406#issuecomment-372602568

 类似资料:
  • 我有一个单身演员的等级制度。父母监督和协调孩子。当重新启动协调器时,我需要保持子角色运行。有没有一种方法可以防止子角色在其父角色重新启动时重新启动,或者我应该重新考虑我的角色层次结构?我一直在研究akka的监管策略,但找不到明确的答案。

  • 我在的文档中读到,http://www.theserverside.com/tutorial/OCPJP-Use-more-precise-rethrow-in-exceptions-Objective-Java-7 基本上,您可以在您的方法的throws子句中列出特定的异常,即使它们不是由捕获块显式处理的,如果: try块实际上在某个时间点抛出该特定异常。 特定的异常在任何时候都没有被前面的捕获

  • 我试图使用Twilio API(使用节点Twilio包装器)实现语音调用,如果调用没有应答,则需要重试x次。似乎如果我忽略了Twilio的呼叫,它会自动继续尝试。那么,我有没有办法将retying限制设置为特定的次数? 提前谢谢。

  • 我对阿克卡很陌生,我有一个(希望)简单的问题。我有一个参与者需要重复执行某个小的子任务——也就是说,每次这个参与者收到消息时,它都必须执行N个子任务。这个子任务是我指定给儿童演员的。我的问题是,我是否应该为每个子任务创建一个新的子角色实例?或者我应该简单地产生一个孩子演员,并发送N条消息?在这种情况下,最好的做法是什么? 为了更好地说明我的问题,这里有两个简化的示例(在Java中-但希望对Scal

  • 我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者

  • 问题内容: 这个问题已经在这里有了答案 : BigInteger是否有上限?[重复] (3个答案) 没有限制的BigInteger是什么意思? (4个答案) 7年前关闭。 我在程序中将两个非常大的BigIntegervalues相乘。失败了 和的限制是什么? 问题答案: 您不会将NumberFormatException与大数字相乘。如果生成的数字太大,则在数组大小溢出时,您将得到一个神秘的Neg