我经常发现自己正在使用" main"为子任务创建许多子actor的actor。当子任务完成后,主要演员也应该停止自己。因此,我会在context.children.isEmpty
时观看儿童演员并停止主演员。
我经常使用这种模式,但我从未读过这个。 我不确定,如果这是一个好主意或是否有失败演员的问题......?
我已经阅读了Shutdown Patterns in Akka 2,但这种方法在Java中似乎比我的解决方案更复杂?
这是我的主代码的伪代码,有两个子任务:
class MainActor extends AbstractActor {
public MainActor() {
receive(ReceiveBuilder
.match(SubTask1Response.class, this::handleSubTask1)
.match(SubTask2Response.class, this::handleSubTask2)
.match(Terminated.class, x -> checkFinished())
.build());
}
@Override
public void preStart() throws Exception {
context().watch(context().actorOf(SubTask1Worker.props(), "subTask1"));
context().watch(context().actorOf(SubTask2Worker.props(), "subTask2"));
}
private void checkFinished() {
if(context().children().isEmpty()) {
context().stop(self());
}
}
// ...
}
(我必须使用Java 8 :-(,但如果你能为我提供另一种解决方案,我也很乐意阅读Scala代码)
答案 0 :(得分:0)
所以context().children().isEmpty()
似乎按预期工作。
但是在调试我的Akka应用程序时,我发现了这种方法的另一个问题:当Terminated
消息到达MainActor
时,它不是确定性的:有时会有Terminated
消息之前示例中的SubTask1Response
!
我现在更改了我的代码来自己计算正在运行的孩子,并在MainActor
收到结果回复SubTask[1,2]Response
时减少数量。
=>所以我不推荐我原来的模式。