2008-09-06 17 views
13

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

+0

Buona domanda. Questo è qualcosa a cui tutti si imbattono, quindi è bello avere la discussione registrata. –

risposta

10

è necessario implementare nel vostro javax.jms.ExceptionListener codice client. Avrai bisogno di un metodo chiamato suException. Quando la connessione del client viene persa, dovresti ottenere una JMSException e questo metodo verrà chiamato automaticamente. L'unica cosa che devi cercare è se stai disconnettendo intenzionalmente da JBossMQ-- che genererà anche un'eccezione.

Alcuni codice potrebbe essere simile a questo:

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 codice "EstablishConnection", si sarebbe poi implementare un costrutto while(!initialized) che contiene un try/catch all'interno di esso. Finché non sarai sicuro di aver collegato e sottoscritto correttamente, rimani all'interno del ciclo while prendendo tutto il JMS/Naming/ecc. eccezioni.

Abbiamo utilizzato questo metodo per anni con JBossMQ e funziona benissimo. Non abbiamo mai avuto problemi con i nostri client JMS che non si sono ricollegati dopo aver saltato JBossMQ o aver perso la nostra connessione di rete.

+0

Si noti che è necessario utilizzare Connection # setExceptionListener (con almeno alcuni provider JMS) per registrare ExceptionListener. – Touko

6

Se si è puramente un ascoltatore e si fa no altre chiamate JMS diverse dall'impostazione della connessione, quindi la risposta "gestore onException()" è corretta.

Se si esegue una JMS chiamate nel codice, usando solo onException() richiamata non è sufficiente. I problemi vengono inoltrati dal provider JMS per l'applicazione sia tramite un'eccezione su un metodo JMS chiamata o attraverso il callback onException(). Non entrambi.

Quindi, se si chiama i metodi JMS dal codice, dovrete anche per invocare che la logica riconnessione se si ottiene alcuna eccezione su quelle chiamate.

1

Un consiglio da esperienza personale. Aggiornamento a JBoss Messaging. L'ho visto in produzione per 4 mesi senza problemi. Ha un failover completamente trasparente - tra molte altre funzionalità.

Inoltre, se si utilizza Spring, è verycareful con JmsTemplate.