Akka:在儿童演员完成后停止演员
Akka: Stop actor after child actors are finished
我经常发现自己使用的 "main" 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 代码)
所以 context().children().isEmpty()
似乎按预期工作。
但是在调试我的 Akka 应用程序时,我发现这种方法还有另一个问题:Terminated
消息何时到达 MainActor
是不确定的:有时会有 Terminated
消息在 示例中的 SubTask1Response
之前!
我现在更改了我的代码以自己计算 运行 children 并在 MainActor
收到结果响应时递减数字 SubTask[1,2]Response
.
=> 所以我不会推荐我原来的模式。
我经常发现自己使用的 "main" 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 代码)
所以 context().children().isEmpty()
似乎按预期工作。
但是在调试我的 Akka 应用程序时,我发现这种方法还有另一个问题:Terminated
消息何时到达 MainActor
是不确定的:有时会有 Terminated
消息在 示例中的 SubTask1Response
之前!
我现在更改了我的代码以自己计算 运行 children 并在 MainActor
收到结果响应时递减数字 SubTask[1,2]Response
.
=> 所以我不会推荐我原来的模式。