我需要在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多秒。
问题是由于以下原因造成的:
在子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