Frage

Wir haben einen Java-Listener, der Textnachrichten aus einer Warteschlange in JBossMQ liest.Wenn wir JBoss neu starten müssen, stellt der Listener keine erneute Verbindung her und beginnt nicht erneut, Nachrichten zu lesen.Wir erhalten lediglich alle 2 Minuten Meldungen in der Protokolldatei des Listeners, dass keine Verbindung hergestellt werden kann.Gibt es etwas, das wir in unserem Code oder in JBossMQ nicht festlegen?Ich bin neu bei JMS, daher bin ich für jede Hilfe sehr dankbar.Danke.

War es hilfreich?

Lösung

Sie sollten in Ihrem Client-Code javax.jms.ExceptionListener implementieren.Sie benötigen eine Methode namens onException.Wenn die Verbindung des Clients unterbrochen wird, sollten Sie eine JMSException erhalten und diese Methode wird automatisch aufgerufen.Das Einzige, worauf Sie achten müssen, ist, wenn Sie absichtlich die Verbindung zu JBossMQ trennen – auch das löst eine Ausnahme aus.

Ein Code könnte so 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 a implementieren while(!initialized) Konstrukt, das einen Try/Catch enthält.Bis Sie sicher sind, dass Sie eine Verbindung hergestellt und sich ordnungsgemäß angemeldet haben, bleiben Sie in der While-Schleife und fangen alle JMS/Naming/usw.-Daten ab.Ausnahmen.

Wir verwenden diese Methode seit Jahren mit JBossMQ und sie funktioniert großartig.Wir hatten noch nie ein Problem damit, dass unsere JMS-Clients nach einem Bounce von JBossMQ oder einem Verlust unserer Netzwerkverbindung keine Verbindung wiederherstellten.

Andere Tipps

Ich würde Ihnen wärmstens empfehlen, das zu verwenden Spring-Abstraktionen für JMS wie der MessageListenerContainer kümmert sich für Sie um Reconnection, Transaktionen und Pooling.Sie müssen lediglich einen MessageListener bereitstellen und den MessageListenerContainer mit der ConnectionFactory konfigurieren. Den Rest erledigt der Container.

Wenn Sie ein reiner Zuhörer sind und das tun NEIN Wenn Sie andere JMS-Aufrufe als den Verbindungsaufbau ausführen, ist die Antwort „onException() handler“ richtig.

Wenn Sie in Ihrem Code JMS-Aufrufe ausführen, reicht es nicht aus, nur den Rückruf onException() zu verwenden.Probleme werden vom JMS-Anbieter an die App weitergeleitet entweder über eine Ausnahme bei einem JMS-Methodenaufruf oder durch den onException()-Rückruf.Nicht beide.

Wenn Sie also JMS-Methoden aus Ihrem Code aufrufen, sollten Sie diese Wiederverbindungslogik auch aufrufen, wenn bei diesen Aufrufen Ausnahmen auftreten.

Ratschlag aus eigener Erfahrung. Upgraden auf JBoss-Messaging. Ich habe es 4 Monate lang ohne Probleme in Produktion gesehen.Es verfügt neben vielen anderen Funktionen über ein vollständig transparentes Failover.

Auch wenn Sie sich für den Frühling entscheiden, dann seien Sie es sehr vorsichtig mit dem JmsTemplate.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top