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

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

  •  07-07-2019
  •  | 
  •  

Pregunta

¿Mantener conexiones / sesiones / consumidor de JMS siempre es una mala práctica?

Ejemplo de borrador de código:

// 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?

¿Fue útil?

Solución

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

Otros consejos

De acuerdo. Aquí hay algunos buenos consejos sobre cómo usar JMS eficientemente que incluye mantener conexiones / sesiones / productores / consumidores.

También puede consultar la recomendación sobre el uso de transacciones también si está interesado en maximizar el rendimiento.

La elección de mantener abierta la conexión / sesión / productor / consumidor durante 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, 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á recursos del sistema como sockets.

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 eso funcione de manera confiable. Pero cualquier problema con eso es un error que el proveedor debe corregir.

Para su información, 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) {
        //
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top