2008-09-06 24 views
13

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

+0

良い質問です。これは誰もが実行するものなので、ディスカッションを記録しておくとよいです。 –

答えて

10

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

いくつかのコードは次のようになります。あなたの「establishConnection」コードで

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

は、あなたがそれの内側のtry/catchが含まれているwhile(!initialized)構造を実装します。あなたが正しく接続し、購読していることを確かめるまで、whileループ内に留まり、すべてのJMS/Naming/etcを捕まえてください。例外。

私たちはこの方法をJBossMQで長年にわたって使ってきました。 JBossMQをバウンスしたり、ネットワーク接続を失ったりした後も、JMSクライアントが再接続することはありませんでした。

+0

ExceptionListenerを登録するには、Connection#setExceptionListener(少なくとも一部のJMSプロバイダを使用)を使用する必要があることに注意してください。 – Touko

8

Spring abstractions for JMS such as the MessageListenerContainerを使用して、再接続、トランザクション、プーリングを処理することを強くお勧めします。 MessageListenerを指定し、ConnectionFactoryでMessageListenerContainerを構成するだけで、残りの部分はコンテナで処理する必要があります。

6

純粋にリスナーであり、なし他のJMS呼び出しで接続設定以外の呼び出しを行った場合、 "onException()handler"という回答は正しいです。

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

コードからJMSメソッドを呼び出す場合、それらの呼び出しで例外が発生した場合は、その再接続ロジックも呼び出すことをお勧めします。

1

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

また、Springと一緒に行く場合は、JmsTemplateverycarefulとなります。

関連する問題