У меня чертовски много времени с некоторыми проблемами Apache NMS.Частично это может быть моим собственным непониманием платформы.
По сути, у меня есть клиент NMS STOMP, который я использую для отправки и получения сообщений AMQ через STOMP.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
.Более того, я понимаю, что они вообще не возникают при использовании аварийного переключения, которое я использую.
Может ли кто-нибудь помочь мне надежно определить, установлено ли соединение или нет?Или, возможно, прояснить любое недоразумение, которое я могу иметь?