2016-08-22 3 views
7

Contexte

Nous voulons utiliser Hazelcast notre mise en œuvre à l'intérieur JCache tomee. Comme nous n'avons pas besoin d'une performance folle, pour l'instant, nous voulons exécuter le noeud Hazelcast dans le cadre de notre application. Nous employons Hazelcast 3.7 et TomEE 7.0.1.fils Hazelcast empêchent tomee d'arrêter

Problème

Lors de l'arrêt tomee, il se plaint de WARNING - The web application [APPLICATION_NAME] appears to have started a thread named [SOMENAME] but has failed to stop it. This is very likely to create a memory leak. plusieurs fois et la machine virtuelle ne s'arrêtera pas normalement garder mais en cours d'exécution.

La solution de contournement est évidemment de tuer le processus dès que semble inactif. Inutile de dire que cela rend fou nos développeurs et nos développeurs.

noeud Hazelcast séparé

Pour exclure la possibilité que les problèmes se posent à partir du nœud Hazelcast en cours d'exécution à l'intérieur tomee, j'ai essayé de démarrer un nœud Hazelcast autonome et changé notre application à utiliser uniquement le client Hazelcast pour se connecter audit noeud. Le comportement est resté le même. Autant que je sache à partir de plusieurs recherches sur le Web, le client Hazelcast démarre plusieurs threads, pour communiquer avec les nœuds du serveur.

Aucun duplicata de Hazelcast empêche la machine virtuelle Java de mettre fin à

Cette question n'est pas un double de Hazelcast prevents the JVM from terminating que nous dépendons totalement sur la mise en œuvre Hazelcasts JCache. Nous n'accédons pas directement à l'instance Hazelcast et par conséquent, nous ne pouvons pas appeler le shutDownAll().

test cas

J'ai créé un small test case on GitHub pour reproduire le problème.

Questions

  • Peut-on utiliser Hazelcast comme back-end JCache dans une application Java EE?
  • Que devons-nous faire pour permettre à l'application de s'arrêter normalement? Peut-on aussi faire fonctionner le nœud Hazelcast dans le cadre de notre application?
  • Si non: Pourquoi est-ce une mauvaise idée?
+0

Possible duplication de [Hazelcast empêche la JVM de se terminer] (http://stackoverflow.com/questions/18701821/hazelcast-prevents-the-jvm-from-terminating) –

Répondre

3

Hazelcast utilise ses propres fils et ils ne sont pas toujours démon, vous pouvez vous assurer que vous arrêtez votre instance de Hazelcast (client ou noeud) par un producteur comme celui https://issues.apache.org/jira/browse/TOMEE-1723

Jusqu'à Hazelcast fixe le cycle de vie de ses Par exemple, grâce à une extension CDI, il est probablement le plus propre que vous puissiez faire.

Note: ceci est également réalisable en utilisant tomee API interne du serveur pour démarrer l'instance précédente, mais pas nécessaire pour la plupart des cas

+0

Oh, je ne savais pas que le 'HazelcastServerCachingProvider 'utilisera réellement CDI pour obtenir le' HazelcastInstance'. Je vais essayer cette première chose demain. Merci pour votre réponse rapide. – Schroenser

+1

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. –

+0

J'ai [mis à jour mon test] (https://github.com/schroenser/hazelcast-in-war-test/tree/with-hazelcast-instance-manager) en ajoutant un HazelCastInstanceManager. Malheureusement, cela ne fait que créer deux instances Hazelcast, dont l'une ne s'arrête pas correctement (probablement celle de JCache). Je vais examiner s'il est possible que HazelcastServerCachingProvider utilise une HazelcastInstance gérée par HazelcastInstanceManager. – Schroenser

2

Solution

rmannibucau « s answer m'a fait la bonne direction.J'ai ajouté un haricot @Observes @Destroyed(ApplicationScoped.class) et appelle Caching.getCachingProvider().close(). Ceci à son tour arrête l'instance de Hazelcast sous-jacente.

Cette solution évite également l'interaction directe avec les classes Hazelcast. La dépendance peut rester limitée à la portée runtime. J'ai ajouté a branch to the test case avec cette solution.