【问题标题】:Akka: Stop actor after child actors are finishedAkka:在儿童演员完成后停止演员
【发布时间】:2015-05-06 12:50:57
【问题描述】:

我经常发现自己使用一个“主要”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 代码)

【问题讨论】:

  • 我认为你的方法绝对没问题。我还阅读了您链接过的文章,我认为这对于更复杂的场景更可行。在他们的示例中,Reaper 似乎只观看用户监护人子演员的一个子集。当您有几个像您的示例中那样不同的儿童演员时,我会采用您的方法。
  • 再读一遍死神似乎更像是一种全球模式。它监视参与者系统层次结构中任意数量的参与者。但是在您的示例中,您只对一位演员的孩子感兴趣。 TLDR:采用你的方法:)
  • 您现在应该(自己?)回答这个问题了吗?

标签: java akka parent-child terminate


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2019-01-01
    • 1970-01-01
    • 2012-10-14
    • 2015-10-16
    相关资源
    最近更新 更多