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

HiC*_*123 1 java web-applications akka

我在我的一个Web应用程序中使用Akka.该应用程序是一个标准的Spring应用程序,它在Tomcat servlet容器中初始化.

我有一个简单的ServletContextListener,如下所示:

public class AkkaInitializer implements ServletContextListener {

      @Override
      public void contextInitialized(ServletContextEvent servletContextEvent) {
           ActorSystem system = ActorSystem.create("system");
           // initialize main top-level master actor here ...


      }

}
Run Code Online (Sandbox Code Playgroud)

在应用程序启动时,Tomcat会调用contextInitialized.现在的问题是,让我们说我有一个顶级演员可能会因为他的一个孩子而失败.我希望这个主操作员基本上记录发生的故障,然后关闭JVM.如何以干净的方式实现这一目标?

Ser*_*nko 6

关闭Akka应用程序的简洁方法可能是:

1)停止接收来自外部世界的请求(取决于您的实施);

2)PoisonPill以正确的顺序向所有顶级演员发送-s(与您应用中的主要数据流完全相似;您的路由器也应该能够PoisonPill向他们的路由广播);

3)使用Reaper模式观察你的演员并决定他们所有人都处理了他们所有的消息然后停止了,之后停止了ActorSystem(不要忘记演员停止在任何情况下停止ActorSystem的合理高超时);

4)等待ActorSystem终止(ActorSystem.awaitTermination(scala.concurrent.duration.Duration timeout));

5)关闭应用程序中应正确终止的所有其他部分;

6)关闭JVM.