同步AKKA演员的最佳实践

时间:2016-12-26 16:53:15

标签: java synchronization akka actor

我有以下要求

我需要完成一项重大任务

演员A:执行主要任务,如果消息为“特殊”,则将其传递给演员B进行处理,然后完成任务 演员B:为主要任务执行特殊逻辑任务,A和B一起完成此A

实施

public static class ActorA extends UntypedActor {


  public void onReceive(Object message) {
    if (message instanceof Work) {
     // if message is special 
ActorRef actorB = this.getContext().actorOf(Props.create(ActorB.class,));
                actorB.tell(new specialTask(message.property), getSelf());

    } else {
      unhandled(message);
    }
  }
}

演员B

 public static class ActorB extends UntypedActor {


      public void onReceive(Object message) {
        if (message instanceof specialTask) {
       //do special task using the message that does not change the state of the message

        } else {
          unhandled(message);
        }
      }
    }

ActorA不依赖于演员Bs任务的完成。但是我不确定在完成时是否应该将演员B传递给A。这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

据我所知,你只想用演员B来计算一些不应该在A中计算的东西。在这种情况下,如果A不依赖于B创造的结果,你就不会这样做。 ;当计算完成时,确实需要从B向A发送消息。你可以用B中的计算结果做任何你想做的事情(写入磁盘,发布到另一个服务等)。

然而,最好使用Akka模式Work PullingReactive Stream来避免来自A的消息溢出你的演员B邮箱。主要想法是让演员B要求任务

另外需要考虑的是,如果B执行任何I / O /繁重的工作/阻塞,强烈建议将此actor放在一个单独的dispatcher中运行,否则它可能会关闭整个系统。