Apache NMS-如何确定连接是否已打开

本文关键字:是否 连接 NMS- 何确定 Apache | 更新日期: 2023-09-27 18:25:37

我遇到了一些Apache NMS问题。部分原因可能是我自己对这个平台缺乏了解。

本质上,我有一个NMSTOMP客户端,用于通过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上找不到任何属性可以告诉我这一点。

我知道ConnectionInterruptedListenerConnectionResumedListenerExceptionListener事件,但在集成测试过程中唯一引发的事件是ExceptionListener。此外,我知道在使用故障切换时根本不会引发这些问题,我在生产中就是这样做的。

有人能帮我可靠地确定连接是否接通吗?或者也许可以澄清我可能存在的任何误解?

Apache NMS-如何确定连接是否已打开

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

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