【发布时间】: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