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

时间:2014-05-22 05:25:23

标签: java web-applications akka

我在我的一个网络应用程序中使用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 ...


      }

}

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

1 个答案:

答案 0 :(得分:5)

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

1)停止从外界获取传入请求(取决于您的实施);

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

3)使用Reaper pattern观察你的演员,并决定他们所有人都处理了他们所有的消息并停止了,之后停止了ActorSystem(不要忘记演员停止停止时的相当高的超时)无论如何都是ActorSystem);

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

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

6)关闭JVM。