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; }
}
我是经过反复试验才实现的。我根本找不到一个简单的方法来确定连接是否"正常"。在IConnection
或Session
上找不到任何属性可以告诉我这一点。
我知道ConnectionInterruptedListener
、ConnectionResumedListener
和ExceptionListener
事件,但在集成测试过程中唯一引发的事件是ExceptionListener
。此外,我知道在使用故障切换时根本不会引发这些问题,我在生产中就是这样做的。
有人能帮我可靠地确定连接是否接通吗?或者也许可以澄清我可能存在的任何误解?
Apache.NMS.Stomp客户端确实有一个故障转移传输,它将调用中断和恢复的方法,但是在使用故障转移时,您实际上不需要关心这些,因为故障转移传输将为您处理重新连接的事情。当使用直接TCP连接时,您只会看到ExceptionListener被调用,因为从TCP传输的角度来看,一旦它失败,它就会失败,因此异常是合适的。
您可以在一般情况下假设,当您的客户端在其ExceptionListener侦听器上收到连接状态失败的回调时,并执行您需要的任何重新连接,尽管如果您使用故障转移传输,它将为您处理,因此您不需要做任何工作。