java - 在 Web 应用程序中正确关闭 Akka actor 系统

标签 java web-applications akka

我在我的一个 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/

相关文章:

scala - Akka HTTP 如何使用 Content-Type application/x-www-form-urlencoded 发布 singleRequest

java-8 - 等待响应时何时选择使用 Actor Inbox 还是 Futures?

java - 从数据库检索的时间为 00 :00:00

java - 基于表单的身份验证如何在 Spring Security 中工作?

javascript - 透明的谷歌齿轮场景验证

php - 表单中的图像提交按钮

scala - Play框架重启时如何重新加载akka调度程序

java - 使用 gradle 进行简单的 protobuf 编译

Java/Android 字符串到颜色的转换

java - Spring mvc 中有哪些 portlet 类?