2017-03-05 1 views
0

Je dois déployer mon application d'entreprise sur un Websphere Application Server (8.5).Pourquoi Hazelcast ne peut pas s'arrêter sur mon serveur d'applications?

Afin de gérer le cycle de vie de Hazelcast I préparé l'objet moniteur suivant:

public class HazelMonitor{ 
    private static HazelcastInstance inst = null; 

    public static synchronized getInstance(){ 
    if(inst == null){ 
     inst = Hazelcast.getOrCreateInstance(...); 
    } 
     return inst; 
    } 

public static synchronized shutdown(){ 
     if(inst != null){ 
      inst.shutdown(); 
      inst = null; 
     } 
} 
} 

Maintenant, mon Ejb est comme ceci:

public class MyEjb{ 
@PostConstruct 
pulic void init(){ 
    HazelMonitor.getInstance(); 
} 

@PreDestroy 
public void close(){ 
    HazelMonitor.shutdown(); 
} 
} 

Tout semble fonctionner, sauf lorsque je tente d'arrêter mon serveur : Hazelcast ne semble tout simplement pas pouvoir s'arrêter et, à la fin, le serveur se bloque et me force à tuer le processus. Une fois que j'ai tué le processus, je reçois une exception de nièce sur une classe non trouvée. Noeud 2.

Qu'est-ce que je fais mal? Comment s'assurer que Hazelcast s'éteint gracieusement avec mon application?

+0

avez-vous confirmé que l'EJB '@ PreDestroy' est en fait invoqué et la'. shutdown() 'appel se passe? –

+0

Je suppose que le classloader est déjà tué lorsque la méthode 'PreDestroy' est appelée. Essayez de l'envelopper dans un bloc try/catch, consignez toute exception qui se produit. – noctarius

Répondre

2

Quelle version Hazelcast utilisez-vous? Nous avons corrigé une fuite de classloader dans 3.8 qui pourrait provoquer un tel comportement (voir https://github.com/hazelcast/hazelcast/pull/9691). Alors s'il vous plaît essayez Hazelcast 3.8 si vous avez déjà utilisé une ancienne version. Sinon, un vidage de fil serait une aide précieuse pour voir ce que fait Hazelcast.

Vous pouvez trouver tous les processus en cours Java via

jps -l 

puis créer le vidage de fil via

jstack <PID>