Pregunta

Tenemos un oyente Java que lee mensajes de texto de una cola en JBossMQ.Si tenemos que reiniciar JBoss, el oyente no se volverá a conectar ni comenzará a leer mensajes nuevamente.Simplemente recibimos mensajes en el archivo de registro del oyente cada 2 minutos que dicen 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.

¿Fue útil?

Solución

Debe implementar en el código de su cliente javax.jms.ExceptionListener.Necesitará un método llamado onException.Cuando se pierde la conexión del cliente, debería obtener una JMSException y este método se llamará automáticamente.Lo único que debe tener en cuenta es si se desconecta intencionalmente de JBossMQ, eso también generará una excepción.

Algún código podría 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 "establecer conexión", luego implementaría un while(!initialized) construcción que contiene un try/catch dentro de ella.Hasta que esté seguro de haberse conectado y suscrito correctamente, permanezca dentro del bucle while capturando todos los JMS/Naming/etc.excepciones.

Hemos utilizado este método durante años con JBossMQ y funciona muy bien.Nunca hemos tenido problemas con nuestros clientes JMS que no se vuelven a conectar después de rebotar JBossMQ o perder nuestra conexión de red.

Otros consejos

Le recomiendo encarecidamente que utilice el Abstracciones de primavera para JMS como MessageListenerContainer para ocuparnos de la reconexión, las transacciones y la agrupación por usted.Solo necesita proporcionar un MessageListener y configurar MessageListenerContainer con ConnectionFactory y el contenedor hace el resto.

Si eres puramente un oyente y haces No otras llamadas JMS distintas a la configuración de la conexión, entonces la respuesta del "controlador onException()" es correcta.

Si realiza alguna llamada JMS en su código, simplemente usar la devolución de llamada onException() no es suficiente.Los problemas se transmiten desde el proveedor JMS a la aplicación. cualquiera a través de una excepción en una llamada al método JMS o a través de la devolución de llamada onException().No ambos.

Entonces, si llama a algún 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. Actualizar a Mensajería JBoss. Lo he visto en producción durante 4 meses sin problemas.Tiene conmutación por error totalmente transparente, entre muchas otras características.

Además, si opta por Spring, tenga en cuenta muy cuidadoso con el Plantilla Jms.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top