2

私はいくつかのApacheNMSの問題で大変な時間を過ごしています。これの一部は、プラットフォームについての私自身の理解の欠如である可能性があります。

基本的に、STOMPを介してAMQメッセージを送受信するために使用するNMSSTOMPクライアントがあります。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。さらに、私が本番環境で使用しているフェイルオーバーを使用しても、それらはまったく発生しないことを理解しています。

接続が確立されているかどうかを確実に判断するのを誰かが助けてくれますか?それとも、私が持っているかもしれない誤解を解消しますか?

4

1 に答える 1

4

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

クライアントがExceptionListenerリスナーでコールバックを受け取ったときに、接続状態が失敗したという一般的なケースの仮定を立てて、必要な再接続を実行できますが、フェイルオーバートランスポートを使用すると処理されるため、作業は必要ありません。あなたの側で。

于 2012-02-25T22:37:40.220 に答える