Des sessions JMS de longue vie. Conserver les connexions / sessions JMS est-il toujours une mauvaise pratique?

StackOverflow https://stackoverflow.com/questions/274051

  •  07-07-2019
  •  | 
  •  

Question

Conserver les connexions / sessions / consommateurs JMS est-il toujours une mauvaise pratique?

Exemple de code:

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

Des suggestions pour améliorer ce modèle d'utilisation de JMS?

Était-ce utile?

La solution

C’est une pratique très courante et acceptable pour les relations à long terme. Pour de nombreux serveurs JMS, il est en fait préférable de créer une nouvelle connexion chaque fois que cela est nécessaire.

Autres conseils

D'accord. Voici quelques bons conseils sur l'utilisation efficace de JMS . ce qui inclut le maintien des connexions / sessions / producteurs / consommateurs.

Vous pouvez également consulter la recommandation sur l'utilisation des transactions . si vous souhaitez optimiser les performances.

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

Si un producteur envoie ou un consommateur reçoit des messages fréquemment, les connexions / sessions / producteur / consommateur doivent rester ouverts. D'un autre côté, si les messages envoyés / reçus sont peu fréquents, le fait de garder ces objets JMS ouverts ne consomme pas de ressources système telles que des sockets.

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

Pour votre information, 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 suffire à libérer les ressources:

try { 
        this.connection.close();
    } catch (JMSException e) {
        //
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top