Wir haben einen Java-Listener, der Textnachrichten aus einer Warteschlange in JBossMQ liest. Wenn wir JBoss neu starten müssen, stellt der Listener die Verbindung nicht wieder her und beginnt erneut, Nachrichten zu lesen. Wir erhalten nur alle 2 Minuten Nachrichten in der Protokolldatei des Hörers, die sagen, dass sie keine Verbindung herstellen können. Gibt es etwas, das wir in unserem Code oder in JBossMQ nicht festlegen? Ich bin neu bei JMS, daher wird jede Hilfe sehr geschätzt. Vielen Dank.Erneutes Verbinden des JMS-Listeners mit JBossMQ
Antwort
Sie sollten in Ihrem Client-Code javax.jms.ExceptionListener implementieren. Sie benötigen eine Methode namens onException. Wenn die Verbindung des Clients verloren geht, sollten Sie eine JMSException erhalten, und diese Methode wird automatisch aufgerufen. Das einzige, worauf Sie achten müssen, ist, dass Sie absichtlich die Verbindung zu JBossMQ trennen - das wird auch eine Ausnahme auslösen.
Einige Code könnte wie folgt aussehen:
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
}
}
In Ihrem "EstablishConnection" Code, würden Sie dann implementieren ein while(!initialized)
Konstrukt, das einen try/catch in der es enthält. Bis du sicher bist, dass du dich richtig verbunden und angemeldet hast, bleibe in der while-Schleife und fange alle JMS/Naming/etc auf. Ausnahmen.
Wir haben diese Methode seit Jahren mit JBossMQ verwendet und es funktioniert super. Wir hatten nie ein Problem damit, dass unsere JMS-Clients nach dem Bouncing von JBossMQ oder dem Verlust unserer Netzwerkverbindung keine Verbindung herstellen.
Beachten Sie, dass Sie Connection # setExceptionListener (mindestens mit einigen JMS-Providern) verwenden sollten, um den ExceptionListener zu registrieren. – Touko
Ich würde Ihnen wärmstens empfehlen, die Spring abstractions for JMS such as the MessageListenerContainer zu verwenden, um mit Wiederverbindung, Transaktionen und Pooling für Sie umzugehen. Sie müssen nur einen MessageListener bereitstellen und den MessageListenerContainer mit der ConnectionFactory konfigurieren, und der Container erledigt den Rest.
Wenn Sie nur Listener sind und keine andere JMS-Aufrufe als Verbindungsaufbau verwenden, ist die Antwort "onException() -Handler" korrekt.
Wenn Sie in Ihrem Code JMS-Aufrufe ausführen, reicht die Verwendung von onException() - Callback nicht aus. Probleme werden vom JMS-Provider an die App entweder über eine Ausnahme für einen JMS-Methodenaufruf oder über den onException() - Callback weitergeleitet. Nicht beide.
Wenn Sie also JMS-Methoden aus Ihrem Code aufrufen, sollten Sie diese Reconnection-Logik auch aufrufen, wenn bei diesen Aufrufen Ausnahmen auftreten.
Ein Ratschlag aus eigener Erfahrung. Upgrade auf JBoss Messaging. Ich habe es in der Produktion seit 4 Monaten ohne Probleme gesehen. Es hat ein vollständig transparentes Failover - neben vielen anderen Funktionen.
Wenn Sie auch mit Feder gehen, geben Sie verycareful mit der JmsTemplate ein.
Gute Frage. Das ist etwas, auf das jeder trifft, also ist es gut, die Diskussion aufzunehmen. –