我在一些 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
可以告诉我这一点。
我知道ConnectionInterruptedListener
、ConnectionResumedListener
和ExceptionListener
事件,但在我的集成测试期间唯一提出的事件是ExceptionListener
. 此外,我知道在使用我正在生产的故障转移时它们根本没有被提出。
谁能帮助我可靠地确定连接是否正常?或者也许澄清我可能有的任何误解?