2

我在一些 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; }
}

我通过反复试验得出了这个实施方案。我根本找不到一种简单的方法来确定连接是否“正常”。没有我可以找到的财产​​,IConnection或者Session可以告诉我这一点。

我知道ConnectionInterruptedListenerConnectionResumedListenerExceptionListener事件,但在我的集成测试期间唯一提出的事件是ExceptionListener. 此外,我知道在使用我正在生产的故障转移时它们根本没有被提出。

谁能帮助我可靠地确定连接是否正常?或者也许澄清我可能有的任何误解?

4

1 回答 1

4

Apache.NMS.Stomp 客户端确实有一个故障转移传输,它将调用中断和恢复的方法,但是当使用故障转移时,您并不需要真正关心这些,因为故障转移传输将为您处理重新连接的事情。使用直接 TCP 连接时,您只会看到调用了 ExceptionListener,因为从 tcp 传输的角度来看,一旦失败,它就失败了,所以一个异常是合适的。

您可以做出一般情况假设,即当您的客户端在其 ExceptionListener 侦听器上收到连接状态失败的回调并执行您需要的任何重新连接时,尽管如果您使用故障转移传输,它将为您处理,因此无需工作就你而言。

于 2012-02-25T22:37:40.220 回答