2017-06-05 5 views
0

lorsque vous envoyez des messages via une MDB, il y a des avertissements concernant les connexions JMS non fermées qui sont ensuite fermées par ActiveMQ. Le MDB reçoit un messageHandler injecté qui obtient une méthode injectée par replysender.MessageDrivenBean: AMQ122000: Je ferme une connexion JMS que vous avez laissée ouverte

C'est l'avertissement je reçois:

[org.apache.activemq.artemis.jms.client] (Finalizer) AMQ122000: I''m closing a JMS connection you left open. Please make sure you close all JMS connections explicitly before letting them go out of scope! see stacktrace to find out where it was created: java.lang.Exception 
at org.apache.activemq.artemis.jms.client.ActiveMQConnection.<init>(ActiveMQConnection.java:155) 
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:750) 
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:233) 
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:229) 
[...] 

L'avertissement se produit (pas à chaque fois) dans le code suivant lorsque le bloc try a terminé (si directement après log.debug (..)) :

private Message doSendAndReturn(XmlMessageCreator messageCreator) throws JMSException { 
    Message message = null; 
    try (Session session = cf.createConnection().createSession(false, Session.AUTO_ACKNOWLEDGE);) { 
     MessageProducer producer = session.createProducer(jmsReplyQueue); 
     message = messageCreator.createMessage(session); 

     producer.send(message); 
     log.debug("JMSTemplate sended message to myEnvironment with ID " 
       + message.getJMSMessageID() 
       + "\n Using Thread " 
       + Thread.currentThread().getName()); 
    } 
    return message; 
} 

Je lis encore que ces avertissements se produisent également lorsque theres aucune référence à l'usine de connexion, mais « cf » est une variable globale singleton qui est définie par le contexte:

@Resource(lookup = "java:/myProject_myEnvironment_factory") 
private ConnectionFactory cf; 

Lors de la définition d'un point de rupture sur log.debug (...), je peux voir qu'il semble fonctionner parfois mais parfois pas. Cette méthode est appelée environ 7 fois pendant que les trois premières fois fonctionnent, puis une fois lance l'avertissement quatre fois (probablement aussi pour chaque appel précédent) et ainsi de suite pour quelques fois. Ceci est reproductible chaque fois que je fais une tâche spécifique dans la webapp.

Je ne sais pas ce qui ne va pas ici.

Un conseil serait reconnaissant. Merci d'avance.

Répondre

0

Je pense que le problème est que, bien que l'objet session soit défini dans la partie try-with-resource mais qu'il n'y ait pas de variable explicite pour la connexion dans la partie try-with-resource.

Après l'avoir modifié de:

try (Session session = cf.createConnection().createSession(false, Session.AUTO_ACKNOWLEDGE);) { 

à:

try (
      Connection connection = cf.createConnection(); 
      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     ) { 

Je ne reçois pas les avertissements plus. Merci d'avoir écouté.