Akka - 孩子发生异常后父母如何发送消息
假设我有一个parent
参与者发送一条消息至其child
角色。Akka - 孩子发生异常后父母如何发送消息
当孩子完成当前消息的处理后,它会通知父母在该消息中将向孩子发送新消息。
为了保持这个循环即使孩子crashs上某个消息,我添加了一个SupervisorStrategy父:
private static SupervisorStrategy strategy =
new OneForOneStrategy(10, Duration.create("1 minute"),
new Function<Throwable, SupervisorStrategy.Directive>() {
@Override
public SupervisorStrategy.Directive apply(Throwable t) {
if (t instanceof NullPointerException) {
return resume();
} else {
return escalate();
}
}
});
的想法是,不管是什么heppens孩子,它会恢复父母将能够发送下一条消息。
但是,父母如何知道错误何时发生,以便发送下一条消息?
家长触发什么事发生在孩子身上?
是否有像我需要重写的“onChileError”方法?
(将一个并欣赏了Java的斯卡拉例子)
感谢。
我建议实行在下一个场景(样品在斯卡拉):
配置主管战略,停止错误
// Stop actors on error - DeathWatch will handle restart sequence
override def supervisorStrategy: SupervisorStrategy = SupervisorStrategy.stoppingStrategy
订阅孩子的死亡表上创建
def createWorker() = {
val worker = actorOf(...)
context.watch(worker)
worker
}
如果孩子意外终止,请创建一个新孩子并重新发送当前要做的部分工作(如果合适的话,可以选择下一个)
case Terminated(actor) =>
val worker = createWorker()
worker ! DoWork(...)
这也将帮助,一旦你开始缩放演员集群,因为当一个节点成为集群中的不可达也不会引发监管策略,只有远程死亡的手表。
当孩子做处理它通知在它反过来会发送一个新的消息,孩子家长目前的消息....
的想法是,不管是什么heppens孩子,它会恢复,父母将能够发送下一条消息。
您目前的主管策略执行以下操作:如果NullPointerException
被投入孩子,孩子将恢复,就好像什么都没发生一样。如果抛出了不同的异常,则会将其升级到演员层次结构的更远处,这可能意味着default supervisor strategy将启动,此时儿童将重新启动。如果你希望孩子继续无论异常,改变你的战略以下(我使用的DeciderBuilder
):
private static SupervisorStrategy strategy =
new OneForOneStrategy(10, Duration.create(1, TimeUnit.MINUTES), DeciderBuilder.
match(Exception.class, e -> {
// getSelf() is the parent and getSender() is the child
GiveMeAnotherMessage message = // ...
getSelf().tell(message, getSender());
resume();
})
.matchAny(o -> escalate())
.build());
@Override
public SupervisorStrategy supervisorStrategy() {
return strategy;
}
但如何父知道什么时候出现错误,为了发送下一条消息?
家长触发什么事发生在孩子身上?
是否有像我需要重写的“onChileError”方法?
该判定可以通过getSender()
访问当前失败孩子的基准,因此,所有你所要做的就是将消息发送到父,让它知道,孩子是准备从内处理另一个消息战略本身,如上面的代码所示。