Akka:在子actor完成后停止主actor

4

我经常使用一个“主”actor来创建多个子actor来执行子任务。当子任务完成时,主actor也应该停止。因此,我会监视子actor,并在context.children.isEmpty时停止主actor。

我经常使用这种模式,但由于从未阅读过相关文献,所以不确定这是否是一个好主意或者是否存在失败的actor问题?

我已经阅读了Akka 2中的关闭模式, 但是相比我的解决方案,这种方法在Java中似乎更加复杂?

以下是我的伪代码,用于具有两个子任务的主actor:

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代码编写,我也很乐意阅读。


我认为你的方法完全没问题。我也读了你提供的文章,我认为它更适用于更复杂的场景。在他们的例子中,Reaper似乎只监视用户保护者子级演员的子集。当你有几个不同的子级演员,就像你的例子一样,我会选择你的方法。 - mavilein
2
再次阅读后,Reaper似乎更像是一个全局模式。它可以监视演员系统层次结构中任意数量的演员。但在您的示例中,您只对一个演员的子级感兴趣。 简而言之:采用您的方法 :) - mavilein
你现在应该(自己?)用一个答案来关闭这个问题了吧? - Diego Martinoia
1个回答

0

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

但是在调试我的Akka应用程序时,我发现了另一个问题:当Terminated消息到达MainActor时,它不是确定性的:有时候Terminated消息会在示例中的SubTask1Response之前出现!

我现在已经更改了我的代码,自己计算正在运行的子项数,并在MainActor接收到结果响应SubTask[1,2]Response时递减该数字。

=> 所以我不建议使用原始模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接