2012-02-23 54 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

相关问题