有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Akka:在子演员完成后停止演员

我经常发现自己在使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主要参与者也应该停止自己。因此,我观看儿童演员,并在^{时停止主要演员

我经常使用这种模式,但因为我从未读过这方面的文章我不确定,这是个好主意还是失败的演员有问题

我读过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代码)


共 (1) 个答案

  1. # 1 楼答案

    所以context().children().isEmpty()似乎像预期的那样起作用

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

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

    =>;所以我不推荐我原来的款式