【发布时间】:2012-03-13 20:18:42
【问题描述】:
我在处理一些 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。此外,我知道在使用故障转移(我正在生产中)时根本不会引发它们。
谁能帮助我可靠地确定连接是否正常?或者澄清一下我可能有的任何误解?
【问题讨论】:
标签: c# .net connection nms apache-nms