2008-11-07 6 views
7

Est-ce que le maintien des connexions/sessions/consommateurs JMS ouvre toujours une mauvaise pratique?Longue vie aux sessions JMS. Le maintien des connexions JMS/sessions JMS est-il toujours une mauvaise pratique?

projet de code exemple:

// app startup code 

ConnectionFactory cf = (ConnectionFactory)jndiContext.lookup(CF_JNDI_NAME); 
Connection connection = cf.createConnection(user,pass); 
Session session = connection.createSession(true,Session.TRANSACTIONAL); 
MessageConsumer consumer = session.createConsumer(new Queue(queueName)); 
consumer.setMessageListener(new MyListener()); 
connection.start(); 
connection.setExceptionListener(new MyExceptionHandler()); // handle connection error 


// ... Message are processed on MyListener asynchronously ... 


// app shutdown code 

consumer.close(); 
session.close(); 
connection.close(); 

Toutes les suggestions pour améliorer ce modèle d'utilisation JMS?

Répondre

4

C'est une pratique très courante et acceptable pour les relations de longue durée. Pour de nombreux serveurs JMS, il est en effet préférable de créer une nouvelle connexion chaque fois que cela est nécessaire.

4

Dans notre application, nous aurons des connexions/sessions/consommateurs/producteurs ouverts pendant des mois à la fois. Nous avons dû travailler avec notre fournisseur (BEA) pour que ce travail fonctionne de manière fiable. Mais tout problème avec cela est un bug que le vendeur doit corriger.

+0

+1 pour une expérience de partage avec le déploiement réel. –

5

Le choix de garder la connexion/session/producteur/consommateur ouvert longtemps ou non devrait être basé sur la fréquence à laquelle le producteur/consommateur envoie/reçoit des messages.

Si un producteur envoie ou si un consommateur reçoit fréquemment des messages, les connexions/sessions/producteur/consommateur doivent rester ouvertes. D'un autre côté, si les messages envoyés/reçus sont peu fréquents, il n'est pas bon de conserver ces objets JMS ouverts pour consommer des ressources système comme des sockets.

0

FYI, il n'est pas nécessaire de fermer les sessions, les producteurs et les consommateurs d'une connexion fermée (javax.jms.Connection). Le code ci-dessous devrait être suffisant pour libérer les ressources:

try { 
     this.connection.close(); 
    } catch (JMSException e) { 
     // 
    }