繁体   English   中英

阿卡:在儿童演员结束后停止演员

[英]Akka: Stop actor after child actors are finished

我经常发现自己使用了一个“主”角色,为子任务创建了许多子角色。 当子任务完成后,主要演员也应该停止自己。 因此,当context.children.isEmpty时,我会观察子演员并停止主演员。

我经常使用这种模式,但我从未读过这个。 我不确定,如果这是一个好主意,或者如果失败的演员有问题......?

我已经阅读过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时,它不是确定性的:有时在示例中的SubTask1Response 之前Terminated消息!

我现在改变了我的代码来自己计算正在运行的子节点,并在MainActor收到结果响应SubTask[1,2]Response时减少数量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM