2017-08-17 70 views
1

假设我有一个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的斯卡拉例子)

感谢。

回答

0

我建议实行在下一个场景(样品在斯卡拉):

配置主管战略,停止错误

// 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(...) 

这也将帮助,一旦你开始缩放演员集群,因为当一个节点成为集群中的不可达也不会引发监管策略,只有远程死亡的手表。

1

当孩子做处理它通知在它反过来会发送一个新的消息,孩子家长目前的消息....

的想法是,不管是什么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()访问当前失败孩子的基准,因此,所有你所要做的就是将消息发送到父,让它知道,孩子是准备从内处理另一个消息战略本身,如上面的代码所示。