Domanda

Abbiamo un ascoltatore Java che legge i messaggi di testo da una coda in JBossMQ.Se dobbiamo riavviare JBoss, l'ascoltatore non si ricollegherà e ricomincerà a leggere i messaggi.Riceviamo semplicemente messaggi nel file di registro dell'ascoltatore ogni 2 minuti che dicono che non è possibile connettersi.C'è qualcosa che non stiamo impostando nel nostro codice o in JBossMQ?Sono nuovo in JMS quindi qualsiasi aiuto sarà molto apprezzato.Grazie.

È stato utile?

Soluzione

Dovresti implementare nel tuo codice client javax.jms.ExceptionListener.Avrai bisogno di un metodo chiamato onException.Quando la connessione del client viene persa, dovresti ottenere una JMSException e questo metodo verrà chiamato automaticamente.L'unica cosa a cui devi prestare attenzione è se ti stai disconnettendo intenzionalmente da JBossMQ: anche questo genererà un'eccezione.

Alcuni codici potrebbero assomigliare a questi:

    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
        }
    }

Nel tuo codice "establishConnection", dovresti quindi implementare a while(!initialized) costrutto che contiene un try/catch al suo interno.Finché non sei sicuro di esserti connesso e iscritto correttamente, rimani all'interno del ciclo while catturando tutti i JMS/Naming/ecc.eccezioni.

Utilizziamo questo metodo da anni con JBossMQ e funziona benissimo.Non abbiamo mai avuto problemi con i nostri client JMS che non si riconnettevano dopo aver rimbalzato JBossMQ o perso la connessione di rete.

Altri suggerimenti

Ti consiglio vivamente di utilizzare il Astrazioni Spring per JMS come MessageListenerContainer per gestire la riconnessione, le transazioni e il pooling per te.Devi solo fornire un MessageListener e configurare MessageListenerContainer con ConnectionFactory e il contenitore farà il resto.

Se sei puramente un ascoltatore e lo fai NO altre chiamate JMS diverse dall'impostazione della connessione, la risposta "gestore onException()" è corretta.

Se esegui chiamate JMS nel tuo codice, il semplice utilizzo del callback onException() non è sufficiente.I problemi vengono inoltrati dal provider JMS all'app O tramite un'eccezione su una chiamata al metodo JMS O tramite il callback onException().Non entrambi.

Pertanto, se chiami qualsiasi metodo JMS dal tuo codice, ti consigliamo di invocare anche la logica di riconnessione se ricevi eccezioni su tali chiamate.

Un consiglio per esperienza personale. L'aggiornamento a Messaggistica JBoss. L'ho visto in produzione per 4 mesi senza problemi.Dispone di failover completamente trasparente, oltre a molte altre funzionalità.

Inoltre, se vai con la primavera, sii molto attento con il JmsTemplate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top