正确的方法来杀死分布式系统中的会话

时间:2015-04-13 19:38:00

标签: mysql session shutdown dropwizard broken-pipe

我正在开发一个使用AKKA框架并在dropwizard服务器上运行的分布式java项目。我在应用程序启动时创建一个会话,并以下列方式在我的所有演员中使用此会话

MyApplication.java

    public void run() {
      final Session actorSession = hibernate.getSessionFactory()
            .openSession();
     // pass this session to various actors
      final ActorSystem system = ActorSystem.create("myActorSystem");
      environment.lifecycle().manage(new ActorSystemGuardian(system));

      system.registerOnTermination(new Runnable() {
            public void run() {
            //Clean all resources after actor termination
            actorSession.close();
        }

ActorSystemGuardan.java

  public class ActorSystemGuardian implements Managed {
    private ActorSystem system;
    public ActorSystemManager(ActorSystem system) {
      this.system = system;
    }

    public void start() throws Exception {

    }

    public void stop() throws Exception {
      system.shutdown();

   }

}

这是否确保正确清洁所有资源? actorSession会被关闭吗?所有参与者都需要在应用程序的生命周期中使用相同的会话。有没有办法让这个会话持久化?

1 个答案:

答案 0 :(得分:2)

我通过以下列方式传递sessionFactory而不是会话来解决问题

final SessionFactory actorSessionFactory = hibernate.getSessionFactory()

这个工厂可以用来产生短暂的会话,可以(应该)在使用后关闭。

system.registerOnTermination(new Runnable() {
        public void run() {
        //Clean all resources after actor termination

    }

仅当actor系统关闭且不应与会话绑定时,才会调用system.registerOnTermination(new Runnable)。