私はこの宝石を見つけました:
接続に障害が発生した場合、クライアントはブローカーへの新しい接続を確立する必要があります。以前の接続で開いたチャネルはすべて自動的に閉じられ、これらも再度開く必要があります。
ですから、それは良くありません。自動再接続を処理してチャネルを再作成し、すべてのコードから発生するこれをカプセル化する大きなレイヤーを作成しようとしています。問題は、これはすでに行われているはずです。これはJavaRMQライブラリで可能ですか?
おそらくこれはRabbitMQクライアントの新機能ですが、私は彼らのドキュメントでこれを見つけました:
自動接続回復を有効にするには、factory.setAutomaticRecoveryEnabled(true) を使用します。
https://www.rabbitmq.com/api-guide.html
問題を解決する必要があるようです。
はい、これが現在の RabbitMQ クライアント実装の大きな欠点であることには同意します。私は約 2 年間 RMQ (.NET ライブラリ) を使用してきましたが、その間あまり変化はありませんでした。ゼロから完全に書き直す必要がありますが、まだそれを行う時間がありません。
しかし、私はいくつかの指針を持っています。まず、接続/チャネル オブジェクトのラッパー クラスを作成します (AMQP 操作を実行するにはチャネルが必要です。接続を使用するのは、チャネルを作成するためだけです)。次に、ラッパー クラスは、チャネルまたは接続が開いているかどうかを追跡し、それに応じて動作します。
私のコードは次のようになります。
while (_iNeedToBeSendingAndReceiving) {
try {
//This blocks indefinitely while waiting for a connection.
using (var channel = ConnectionWrapper.CreateChannel(string connectionString) {
//Do stuff, blah, blah
//When the connection or channel closes, an exception is thrown and
//I move to the catch block.
}
catch(ConnectionInterruptException ex) {
//Eat, yummy!
}
}
私の最終的な計画は、このようなものを抽象化し、RabbitMQ (またはその他のメッセージング) ライブラリとやり取りするまったく新しい方法を作成することです。作業が完了したらお知らせします。数か月かかる場合があります。