13

JBossMQ のキューからテキスト メッセージを読み取る Java リスナーがあります。JBoss を再起動する必要がある場合、リスナーは再接続せず、メッセージの読み取りを再開しません。接続できないというメッセージが 2 分ごとにリスナーのログ ファイルに記録されます。コードまたは JBossMQ で設定していないものはありますか? 私は JMS を初めて使用するので、どんな助けでも大歓迎です。ありがとう。

4

4 に答える 4

10

クライアント コードに javax.jms.ExceptionListener を実装する必要があります。onException というメソッドが必要です。クライアントの接続が失われると、JMSException が発生し、このメソッドが自動的に呼び出されます。注意しなければならない唯一のことは、JBossMQ から意図的に切断している場合です。これも例外をスローします。

一部のコードは次のようになります。

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

次に、「 EstablishConnection 」コードで、while(!initialized)内部に try/catch を含む構成を実装します。正しく接続してサブスクライブしたことを確認するまで、while ループ内にとどまり、すべての JMS/Naming/etc をキャッチします。例外。

JBossMQ でこの方法を何年も使用してきましたが、うまく機能します。JBossMQ をバウンスしたり、ネットワーク接続を失ったりした後に、JMS クライアントが再接続しないという問題は一度もありません。

于 2008-09-07T00:05:10.490 に答える
9

再接続、トランザクション、およびプーリングを処理するために、MessageListenerContainerなどのJMS用のSpring抽象化を使用することを強くお勧めします。MessageListenerを提供し、ConnectionFactoryを使用してMessageListenerContainerを構成するだけで、残りはコンテナーが行います。

于 2008-09-16T14:24:52.360 に答える
6

あなたが純粋にリスナーであり、接続セットアップ以外の JMS 呼び出しを行わない場合、「onException() ハンドラー」の答えは正しいです。

コードで JMS 呼び出しを行う場合、 onException() コールバックを使用するだけでは不十分です。問題は、 JMS メソッド呼び出しの例外または onException() コールバックを介して JMSプロバイダーからアプリに中継されます。両方ではありません。

したがって、コードから JMS メソッドを呼び出す場合、それらの呼び出しで例外が発生した場合は、その再接続ロジックも呼び出す必要があります。

于 2008-09-22T20:43:01.253 に答える
1

個人的な経験からのアドバイス。 JBossMessagingにアップグレードします。 私はそれを問題なく4ヶ月間生産で見ました。他の多くの機能の中でも、完全に透過的なフェイルオーバーを備えています。

また、Springを使用する場合は、 JmsTemplate 十分注意してください。

于 2008-09-23T00:47:41.803 に答える