我有些时间处理Apache NMS问题。部分原因可能是我自己对平台的理解不够。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
。而且,据我所知,在使用我正在生产的故障转移时,他们根本没有提出任何问题。
任何人都可以帮助我可靠地确定连接是否启动?或者也许清除我可能有的任何误解?
谢谢。我需要了解连接问题的原因有两个:1.向用户提供反馈。 2. AMQ恢复后,重新建立我们在AMQ上运行的基础架构。不幸的是,一旦AMQ恢复正常,故障转移不足以确保基础架构重新建立。 – 2012-02-27 09:51:35
ConnectionInterruptedListener和ConnectionResumedListener将在连接丢失时调用,随后在使用故障转移时恢复。 – 2012-02-28 15:04:58