2008-11-07 10 views
7

Mantener las conexiones/sesiones/consumidor JMS ¿siempre abre una mala práctica?Largas sesiones de JMS. Mantener las conexiones JMS/sesiones JMS siempre abiertas ¿una mala práctica?

proyecto de código de ejemplo:

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

alguna sugerencia para mejorar este patrón de uso de JMS?

Respuesta

4

Esa es una práctica muy común y aceptable cuando se trata de conexiones de larga vida. Para muchos servidores JMS, de hecho, es preferible crear una nueva conexión cada vez que sea necesario.

4

En nuestra aplicación, tendremos conexiones/sesiones/consumidores/productores abiertos durante meses a la vez. Hemos tenido que trabajar con nuestro proveedor (BEA) para que ese trabajo sea confiable. Pero cualquier problema con eso es un error que el vendedor necesita reparar.

+0

+1 para compartir experiencias con el despliegue real. –

5

La elección de mantener la conexión/sesión/productor/consumidor abierta por mucho tiempo o no debe basarse en la frecuencia con la que el productor/consumidor envía/recibe mensajes.

Si un productor envía o un consumidor recibe mensajes con frecuencia, entonces las conexiones/sesiones/productor/consumidor deben mantenerse abiertas. Por otro lado, si los mensajes de envío/recepción son poco frecuentes, entonces no es bueno mantener estos objetos JMS abiertos consumirá los recursos del sistema como los sockets.

0

FYI, no es necesario cerrar las sesiones, los productores y los consumidores de una conexión cerrada (javax.jms.Connection). El siguiente código debería ser suficiente para liberar los recursos:

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