JMSでは、接続が失われたかどうかを簡単に見つけることができ、例外が発生します。しかし、接続が再び存在するかどうかを確認するにはどうすればよいですか?
シナリオ:JMSを使用してサーバーと通信します。接続が切断され(サーバーがダウンしている)、例外が発生します。ここまでは順調ですね。サーバーが再び起動し、接続が再確立された場合、どうすればそれを知ることができますか?
そのような情報を促進するリスナーは見当たりません。
ああ...古い例外処理/再接続の難問。
アプリケーションを自動的に再接続するトランスポートプロバイダーと、アプリドライブを再接続するトランスポートプロバイダーがあります。一般に、再接続は例外をアプリケーションから隠します。欠点は、allリモートメッセージングノードがダウンしている場合にアプリが永久にハングしないようにすることです。したがって、最終的には必須いくつかの再接続ロジックを含める必要があります。
ここで興味深い部分があります-プロバイダーに依存しない方法で例外をどのように処理しますか? JMS例外は実質的に価値がありません。たとえば、「セキュリティ例外」は、Javaセキュリティポリシーが制限されすぎている、ファイルシステムのアクセス許可が制限されすぎている、LDAP資格情報が失敗した、トランスポートへの接続が失敗したなどです。 、キューまたはトピックのオープンに失敗したか、その他のセキュリティ関連の問題が多数あります。問題のデバッグに本当に役立つトランスポートプロバイダーからの詳細が含まれているのはリンクされた例外です。私のクライアントは通常、3つの異なるアプローチのいずれかを採用していますここに...
あなたの場合、キューオブジェクトとトピックオブジェクトは、おそらく元の接続のコンテキストでのみ有効です。自動的に再接続するプロバイダーが例外を受け取ったという事実は、再接続が失敗し、キューおよびトピックオブジェクトのコンテキストを復元できなかったことを意味すると想定します。すべてのオブジェクトを閉じて、再接続します。
一時的なエラーと永続的なエラーを区別するなど、プロバイダー固有の処理を実行するかどうかは、「状況によって異なります」の1つであり、ケースバイケースで把握する必要があります。
接続例外を監視する最良の方法は、次のような例外リスナーを設定することです。
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("jmsContextName");
connection = connectionFactory.createConnection();
connection.setExceptionListener(new ExceptionListener() {
@Override
public void onException(JMSException exception) {
logger.error("ExceptionListener triggered: " + exception.getMessage(), exception);
try {
Thread.sleep(5000); // Wait 5 seconds (JMS server restarted?)
restartJSMConnection();
} catch (InterruptedException e) {
logger.error("Error pausing thread" + e.getMessage());
}
}
});
connection.start();
JMS仕様では、トランスポートプロトコルについては説明されておらず、接続についても何も述べられていません(つまり、ブローカーが接続を維持するか、セッションごとに新しい接続を確立する必要があります)。だから、私はあなたが何を意味すると思います
接続が切断され(サーバーがダウンしている)、例外が発生します。
メッセージを送信しようとしていて、JmsExceptionが発生しているということです。
ブローカーが稼働しているかどうかを確認する唯一の方法は、メッセージを送信することだと思います。
接続ベースのJMSExceptionの場合の唯一のオプションは、例外ハンドラーで接続の再確立を試み、操作を再試行することです。