java - Reconectando el oyente JMS a JBossMQ
(4)
Tenemos un oyente Java que lee los mensajes de texto de una cola en JBossMQ. Si tenemos que reiniciar JBoss, el oyente no se volverá a conectar y comenzará a leer los mensajes nuevamente. Acabamos de recibir mensajes en el archivo de registro del oyente cada 2 minutos diciendo que no se puede conectar. ¿Hay algo que no estamos configurando en nuestro código o en JBossMQ? Soy nuevo en JMS por lo que cualquier ayuda será muy apreciada. Gracias.
Recomiendo encarecidamente que utilice las abstracciones de Spring para JMS, como MessageListenerContainer, para tratar la reconexión, las transacciones y la agrupación por usted. Solo necesita suministrar un MessageListener y configurar MessageListenerContainer con ConnectionFactory y el contenedor hace el resto.
Si solo escucha y no realiza otras llamadas JMS que no sean la configuración de conexión, entonces la respuesta "onException () handler" es correcta.
Si realiza alguna llamada JMS en su código, solo usar la devolución de llamada onException () no es suficiente. Los problemas se transmiten desde el proveedor JMS a la aplicación, ya sea a través de una excepción en una llamada al método JMS oa través de la devolución de llamada onException (). No ambos.
Entonces, si llama a cualquier método JMS desde su código, también querrá invocar esa lógica de reconexión si obtiene alguna excepción en esas llamadas.
Un consejo de experiencia personal. Actualice a JBoss Messaging . Lo he visto en producción durante 4 meses sin problemas. Tiene conmutación por error completamente transparente, entre muchas otras características.
Además, si vas con Spring, ten mucho cuidado con JmsTemplate .
Debería implementar en su código de cliente javax.jms.ExceptionListener. Necesitará un método llamado onException. Cuando se pierde la conexión del cliente, debe obtener una JMSException y este método se llamará automáticamente. Lo único que debes tener en cuenta es si te desconectas intencionadamente de JBossMQ, lo que también generará una excepción.
Algunos códigos pueden verse así:
public void onException (JMSException jsme)
{
if (!closeRequested)
{
this.disconnect();
this.establishConnection(connectionProps, queueName, uname, pword, clientID, messageSelector);
}
else
{
//Client requested close so do not try to reconnect
}
}
En su código "establishConnection", implementaría una construcción while(!initialized)
que contiene un try / catch dentro de ella. Hasta que esté seguro de que se ha conectado y se ha suscrito correctamente, permanezca dentro del bucle while capturando todos los JMS / Naming / etc. excepciones
Hemos usado este método durante años con JBossMQ y funciona muy bien. Nunca hemos tenido un problema con nuestros clientes JMS que no se vuelven a conectar después de rebotar JBossMQ o perder nuestra conexión de red.