Java 同步AKKA演员最佳实践

Java 同步AKKA演员最佳实践,java,synchronization,akka,actor,Java,Synchronization,Akka,Actor,我有以下要求 我需要完成一项重大任务 参与者A:执行主要任务,如果消息是“特殊的”,则将其传递给参与者B进行处理,然后完成任务 参与者B:为主要任务执行特殊的逻辑任务,A和B一起完成此任务 实施 public static class ActorA extends UntypedActor { public void onReceive(Object message) { if (message instanceof Work) { // if message is s

我有以下要求

我需要完成一项重大任务

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

实施

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不依赖于actor Bs任务的完成。但我不确定演员B和演员A之间是否应该没有消息传递。这是正确的方法吗?

据我所知,您只想使用Actor B计算A中不应计算的内容。在这种情况下,如果A不依赖于B创建的结果,那么在计算完成后,您实际上不需要从B向A发送消息。您可以对B中的计算结果执行任何操作(写入磁盘、发送到另一个服务等)

但是,使用Akka模式as或a是一种很好的做法,以避免来自a的消息溢出actor B邮箱。主要思想是让actor B请求任务


另一个要考虑的问题是,如果B做了任何I/O/重工/阻塞,则强烈建议把这个演员放在一个分开的地方运行,否则它可以关闭整个系统。

工作代码应该转到CODEVIEWS.STACKExchange。谢谢,欢迎你。。。那就删除这个吧!我的意思是那里不接受,所以我会在这里继续问。我不想让我的代码被审查,看它是否能工作,我只想知道bst在这种情况下的做法。嗨,谢谢你的回答。参与者B不执行阻塞任务,您能告诉我您指的是参与者请求任务的模式吗?如果您正在谈论演员发送消息的ask方法,那么这将返回一个未来。但是,父参与者并不关心参与者BHi返回的结果。不是来自akkaapi的ask模式。我刚刚添加了工作拉动模式的链接和关于反应流的链接,这是处理背压的另一种选择,考虑到您的参与者A生成消息的速度比B处理消息的速度快的情况。但据我所知,你最初的设计没有什么问题。我只是指出了这一点,因为我花了一段时间才意识到我需要使用单独的调度器来阻止呼叫和处理邮箱溢出。明白了,谢谢你的解释,在邮件处理后没有确认发件人似乎很奇怪