2012-02-23 50 views
1

我有些時間處理Apache NMS問題。部分原因可能是我自己對平臺的理解不夠。Apache NMS - 如何確定連接是否已經啓動

本質上,我有一個NMS STOMP客戶端,我用它通過STOMP發送和接收AMQ消息。該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; } 
} 

我來到這個實現通過試驗和錯誤。我根本找不到一個簡單的方法來確定連接是否「啓動」。沒有我可以在IConnectionSession找到的財產​​,這將告訴我這一點。

我知道ConnectionInterruptedListener,ConnectionResumedListenerExceptionListener事件,但在我的集成測試中唯一發生的事件是ExceptionListener。而且,據我所知,在使用我正在生產的故障轉移時,他們根本沒有提出任何問題。

任何人都可以幫助我可靠地確定連接是否啓動?或者也許清除我可能有的任何誤解?

回答

3

Apache.NMS.Stomp客戶端確實有一個故障轉移傳輸,它將調用中斷和恢復的方法,但是在使用故障轉移時,您並不需要關心那些故障轉移傳輸將處理重新連接。當使用直接的TCP連接時,只會看到ExceptionListener被調用,因爲從tcp傳輸的角度來看,一旦它失敗了,所以一個異常是合適的。

當您的客戶端在其ExceptionListener偵聽器上回調連接狀態失敗並執行所需的任何重新連接時,您可以進行一般情況下的假設,但如果使用故障轉移傳輸,它將爲您處理,所以你不需要做任何工作。

+0

謝謝。我需要了解連接問題的原因有兩個:1.向用戶提供反饋。 2. AMQ恢復後,重新建立我們在AMQ上運行的基礎架構。不幸的是,一旦AMQ恢復正常,故障轉移不足以確保基礎架構重新建立。 – 2012-02-27 09:51:35

+1

ConnectionInterruptedListener和ConnectionResumedListener將在連接丟失時調用,隨後在使用故障轉移時恢復。 – 2012-02-28 15:04:58

相關問題