Apache NMSの問題があります。これの一部は、プラットフォームの理解が自分自身の欠如かもしれません。Apache NMS - 接続が確立しているかどうかを判断する方法
本質的に、STOMP経由でAMQメッセージを送受信するために使用するNMS STOMPクライアントがあります。 APIは、ビットのようになります。
internal sealed class NMSStompClient : IDisposable
{
public bool IsConnected { get; }
public void Connect(Uri uri, string userId, string password, TimeSpan timeout);
public void Disconnect();
public void Send(IDestination destination, IDestination replyDestination, long sessionId, int correlationId, byte[] messageBytes, TimeSpan timeout);
public IDisposable Subscribe(IDestination destination, Action<IMessage> messageHandler, Action<IMessage, Exception> errorHandler);
}
私は私の統合テストが一貫し合格するために取得しようとするんだけど、私はAMQが10秒で渡す(のためにダウンしている時間の量を増やしたときに、彼らは常に失敗します、 60で失敗する)。デバッグの量を耐え難いおよびトレースの後、私はこの問題は、私のIsConnected
実装(あるいは、少なくとも、これが問題の一部である)に由来するように見えることを発見しました:
public bool IsConnected
{
// connection is Apache.NMS.IConnection
// session is Apache.NMS.Stomp.Session
get { return this.connection != null && this.connection.IsStarted && this.session != null && this.session.Connection == this.connection; }
}
私はこの実装に到着しました試行錯誤を経て私は、単に接続が "アップ"であったかどうかを判断する簡単な方法を見つけることができませんでした。 IConnection
またはSession
のいずれかに私が見つけることができるプロパティはありません。
私はConnectionInterruptedListener
、ConnectionResumedListener
、およびExceptionListener
イベントを認識してんだけど、私の統合テスト中に発生しただけでExceptionListener
です。さらに、私は生産中のフェイルオーバーを使用しても、それらがまったく持ち上がらないことを理解しています。
接続が有効かどうかを誰でも確実に判断するのに役立ちますか?あるいは、私が持っている可能性のある誤解を解決するか?
ありがとうございました。接続の問題について私が知る必要がある理由は2つあります。1.ユーザーにフィードバックを提供します。 2. AMQが復旧したら、AMQの上で実行しているインフラストラクチャを再構築します。残念ながら、フェールオーバーでは、AMQが復帰した後にインフラストラクチャが再確立されたことを確認するだけでは不十分です。 –
ConnectionInterruptedListenerおよびConnectionResumedListenerは、接続が失われたときに呼び出され、フェールオーバーを使用するときに復元されます。 –