2012-02-23 6 views
1

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のいずれかに私が見つけることができるプロパティはありません。

私はConnectionInterruptedListenerConnectionResumedListener、およびExceptionListenerイベントを認識してんだけど、私の統合テスト中に発生しただけでExceptionListenerです。さらに、私は生産中のフェイルオーバーを使用しても、それらがまったく持ち上がらないことを理解しています。

接続が有効かどうかを誰でも確実に判断するのに役立ちますか?あるいは、私が持っている可能性のある誤解を解決するか?

答えて

3

Apache.NMS.Stompクライアントは、中断されたメソッドと再開されたメソッドを呼び出すフェールオーバートランスポートを実際には持っていますが、フェイルオーバーを使用する場合は、フェイルオーバートランスポートによって事態の再接続が処理されるため、 。ストレートTCP接続を使用している場合は、tcpトランスポートの観点から、失敗したためにExceptionListenerが呼び出されるだけです。例外が適切です。

通常のケースでは、クライアントがExceptionListenerリスナーでコールバックを取得して接続状態に失敗し、必要な再接続を実行することができますが、フェールオーバートランスポートを使用する場合は、あなたの仕事に必要な作業はありません。

+0

ありがとうございました。接続の問題について私が知る必要がある理由は2つあります。1.ユーザーにフィードバックを提供します。 2. AMQが復旧したら、AMQの上で実行しているインフラストラクチャを再構築します。残念ながら、フェールオーバーでは、AMQが復帰した後にインフラストラクチャが再確立されたことを確認するだけでは不十分です。 –

+1

ConnectionInterruptedListenerおよびConnectionResumedListenerは、接続が失われたときに呼び出され、フェールオーバーを使用するときに復元されます。 –

関連する問題