我有以下要求
我需要完成一项重大任务
演员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。这是正确的方法吗?
答案 0 :(得分:0)
据我所知,你只想用演员B来计算一些不应该在A中计算的东西。在这种情况下,如果A不依赖于B创造的结果,你就不会这样做。 ;当计算完成时,确实需要从B向A发送消息。你可以用B中的计算结果做任何你想做的事情(写入磁盘,发布到另一个服务等)。
然而,最好使用Akka模式Work Pulling或Reactive Stream来避免来自A的消息溢出你的演员B邮箱。主要想法是让演员B要求任务
另外需要考虑的是,如果B执行任何I / O /繁重的工作/阻塞,强烈建议将此actor放在一个单独的dispatcher中运行,否则它可能会关闭整个系统。