我在我的一个 Web 应用程序中使用 Akka。该应用程序是在 Tomcat servlet 容器中初始化的标准 Spring 应用程序。
我有一个像这样的简单 ServletContextListener:
public class AkkaInitializer implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ActorSystem system = ActorSystem.create("system");
// initialize main top-level master actor here ...
}
}
contextInitialized 在应用程序启动时由 Tomcat 调用。 现在的问题是,假设我有一位顶级 Actor ,他的一个 child 可能会升级为失败。我希望这个主要参与者基本上记录发生的故障并在之后关闭 JVM。如何以干净的方式实现这一目标?
最佳答案
关闭 Akka 应用程序的干净方式可能是:
1) 停止接收来自外界的传入请求(取决于您的实现);
2) 以正确的顺序向所有顶级参与者发送 PoisonPill
-s(与您应用中的主要数据流完全或相似;您的路由器也应该能够广播 PoisonPill
-s to their routees);
3) 使用 Reaper pattern观察您的 actor 并确定他们都已处理完所有消息并停止,然后停止 ActorSystem(在任何情况下都不要忘记 actor 停止以停止 ActorSystem 的相当高的超时);
4) 等待 ActorSystem 终止 (ActorSystem.awaitTermination(scala.concurrent.duration.Duration timeout)
);
5) 关闭应用程序的所有其他应正确终止的部分;
6) 关闭 JVM。
关于java - 在 Web 应用程序中正确关闭 Akka actor 系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23798414/