2014-05-22 52 views
1

我在我的一个Web应用程序中使用Akka。该应用程序是一个标准的Spring应用程序,它在Tomcat servlet容器中初始化。在Web应用程序中正确关闭Akka actor系统

我有一个简单的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上称为应用程序的启动。 现在的问题是,假设我有一个顶级演员,他的一个孩子可能会升级失败。我希望这个主角能够记录发生的故障并在之后关闭JVM。这怎么能够以一种干净的方式来实现?

回答

5

关闭的阿卡应用的清洁方式可能是:

1)停止正从外界传入的请求(取决于具体的实现); 2)发送PoisonPill -s到正确顺序的所有顶级演员(确切或类似于您的应用中的主要数据流;您的路由器也应该能够将PoisonPill -s广播到他们的路由中);然后将PoisonPill -s发送到他们的路由。

3)使用Reaper pattern来观察你的演员,并确定他们已经处理了所有的消息并停止,之后停止ActorSystem(不要忘记演员在任何时候停止停止ActorSystem的合理高超时案件);

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

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

6)关闭JVM。

+0

感谢您的反馈意见。在我的postStop钩子中调用getContext()。system()。shutdown()方法是否会出错?然后,无论我初始化我的演员系统,我都可以调用actorSystem.registerOnTermination({system.exit(1);}); – HiChews123

+1

如果你的数据流很简单,并且在你的主演员停下来之后不可能进行其他重要的数据处理(其他演员) - 那么,我想,是的。 –

相关问题