Akka:在儿童演员完成后停止演员

Akka: Stop actor after child actors are finished

我经常发现自己使用的 "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 代码)

所以 context().children().isEmpty() 似乎按预期工作。

但是在调试我的 Akka 应用程序时,我发现这种方法还有另一个问题:Terminated 消息何时到达 MainActor 是不确定的:有时会有 Terminated 消息 示例中的 SubTask1Response 之前!

我现在更改了我的代码以自己计算 运行 children 并在 MainActor 收到结果响应时递减数字 SubTask[1,2]Response.

=> 所以我不会推荐我原来的模式。