2015-04-13 4 views
1

Je travaille sur un projet java distribué qui utilise le framework AKKA et s'exécute sur un serveur dropwizard. Je crée une session au démarrage de l'application et l'utilisation de cette session à travers tous mes acteurs de la manière suivanteManière correcte de tuer une session dans un système distribué

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(); 

    } 

}

Est-ce Cela assure-t-il le bon nettoyage de toutes les ressources? L'acteur sera-t-il fermé? Tous les acteurs doivent utiliser la même session tout au long de la vie de l'application. Y a-t-il un moyen de rendre cette session persistante?

Répondre

2

je résolu le problème en passant le sessionFactory au lieu d'une session de la manière suivante

final SessionFactory actorSessionFactory = hibernate.getSessionFactory() 

Cette usine peut alors être utilisé pour reproduire des séances éphémères qui peuvent être (devrait être) fermé après utilisation.

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

    } 

Le system.registerOnTermination (nouveau Runnable) est appelée que lorsque le système d'acteur est arrêté et ne doit pas être liée aux sessions.