我遇到一些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
。此外,我知道在使用故障转移时它们根本没有被提升,我正在制作它。
任何人都可以帮我确定连接是否正常?或者澄清我可能有的任何误解?
答案 0 :(得分:4)
Apache.NMS.Stomp客户端确实有一个故障转移传输,它将调用被中断和恢复的方法但是在使用故障转移时你不需要关心那些,因为故障转移传输将处理重新连接的东西您。使用直接TCP连接时,您只会看到调用的ExceptionListener,因为从tcp传输的角度来看,一旦失败失败,所以异常是合适的。
您可以做出一般情况假设:当您的客户端在其ExceptionListener侦听器上获得回调时连接状态失败并执行您需要的任何重新连接时,尽管如果您使用故障转移传输,它将为您处理,因此你不需要做任何工作。