JBossMQ のキューからテキスト メッセージを読み取る Java リスナーがあります。JBoss を再起動する必要がある場合、リスナーは再接続せず、メッセージの読み取りを再開しません。接続できないというメッセージが 2 分ごとにリスナーのログ ファイルに記録されます。コードまたは JBossMQ で設定していないものはありますか? 私は JMS を初めて使用するので、どんな助けでも大歓迎です。ありがとう。
4 に答える
クライアント コードに 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 クライアントが再接続しないという問題は一度もありません。
再接続、トランザクション、およびプーリングを処理するために、MessageListenerContainerなどのJMS用のSpring抽象化を使用することを強くお勧めします。MessageListenerを提供し、ConnectionFactoryを使用してMessageListenerContainerを構成するだけで、残りはコンテナーが行います。
あなたが純粋にリスナーであり、接続セットアップ以外の JMS 呼び出しを行わない場合、「onException() ハンドラー」の答えは正しいです。
コードで JMS 呼び出しを行う場合、 onException() コールバックを使用するだけでは不十分です。問題は、 JMS メソッド呼び出しの例外または onException() コールバックを介して、 JMSプロバイダーからアプリに中継されます。両方ではありません。
したがって、コードから JMS メソッドを呼び出す場合、それらの呼び出しで例外が発生した場合は、その再接続ロジックも呼び出す必要があります。
個人的な経験からのアドバイス。 JBossMessagingにアップグレードします。 私はそれを問題なく4ヶ月間生産で見ました。他の多くの機能の中でも、完全に透過的なフェイルオーバーを備えています。
また、Springを使用する場合は、 JmsTemplateに 十分注意してください。