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
risposta
è 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.
Si noti che è necessario utilizzare Connection # setExceptionListener (con almeno alcuni provider JMS) per registrare ExceptionListener. – Touko
mi raccomando di utilizzare il Spring abstractions for JMS such as the MessageListenerContainer a che fare con la riconnessione, transazioni e pool per voi. È sufficiente fornire un MessageListener e configurare MessageListenerContainer con ConnectionFactory e il contenitore fa il resto.
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.
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.
Buona domanda. Questo è qualcosa a cui tutti si imbattono, quindi è bello avere la discussione registrata. –