gpt4 book ai didi

java - 将 Akka PoisonPill 连接到 actor 系统和 JVM 关闭 Hook

转载 作者:行者123 更新时间:2023-11-30 02:00:14 25 4
gpt4 key购买 nike

Akka/Java 到这里,虽然我对Scala有了基本的了解。 Akka 新手。我有一个 Master 类,它在 Actor 系统启动时启动,它管理三个子级:FizzBuzzFoo.

Master 启动时,对 doSomething() 的调用可能会抛出 NoSuchElementException。如果确实如此,我希望 Master 关闭其三个子级,杀死自身,关闭整个 Actor 系统,然后调用自定义系统关闭 Hook 。迄今为止我最好的尝试:

public class MyApp {
public static void main(String[] args) {
ActorRef master = actorSystem.actorOf(Props.create(Master.class));
master.tell(new Init(), ActorRef.noSender());

Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
void run() {
System.out.println("Shutting down!");
}
});
}
}

public class Master extends AbstractActor {
private Logger log = LoggerFactory.getLogger(this.getClass());

private ActorRef fizz;
private ActorRef buzz;
private ActorRef foo;

public Master() {
super();
}

@Override
public Receive createReceive() {
return receiveBuilder()
.match(Init.class, init -> {
try {
fizz = context().actorOf(Props.create(Fizz.class));
buzz = context().actorOf(Props.create(Buzz.class));
foo = context().actorOf(Props.create(Foo.class));

long metric = doSomething();

log.info("After all the children started up \"metric\" was: {}", metric);
} catch(NoSuchElementException ex) {
self().tell(PoisonPill.getInstance(), self());
}
}).build();
}
}

我的想法是:

  • 由于 Master 是最顶层的 Actor,我无法定义 SupervisorStrategy 来为我处理抛出的 NoSuchElementException,所以我必须在那里放置一个 try-catch 来处理它
  • 我对 PoisonPill理解是,它会关闭接收 Actor 的子级,然后关闭 Actor
  • 但是,我仍然不清楚 PoisonPill 是否会关闭 Actor 系统如果 Actor 恰好是根/顶级 Actor,而且我也没有看到我如何连接 PoisonPill 来不仅关闭 actor 系统,而且还启用 JVM 的关闭钩子(Hook)

当我运行此代码时,我没有看到参与者系统关闭的任何证据,它只是挂起。有什么想法如何将所有这些连接在一起以达到预期的效果吗?

最佳答案

实现所需行为的一种方法是让主 Actor 调用 getContext().getSystem().terminate() 并使用 ActorSystem.registerOnTermination 注册一个包含关闭逻辑的回调。 :

actorSystem.registerOnTermination(new Runnable {
@Override
public void run() {
System.out.println("Shutting down!");
}
});

// ...

try {
// ...
} catch (NoSuchElementException ex) {
getContext().getSystem().terminate();
}

Coordinated shutdown可用于涉及更多的关闭过程。

关于java - 将 Akka PoisonPill 连接到 actor 系统和 JVM 关闭 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53122578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com