Apache NMS - как определить, установлено ли соединение
У меня чертовски много времени с некоторыми проблемами 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
, Более того, я понимаю, что они вообще не возникают при использовании аварийного переключения, которое я использую.
Может кто-нибудь помочь мне надежно определить, установлено ли соединение или нет? Или, возможно, прояснить любое недоразумение, которое я могу иметь?
1 ответ
В клиенте Apache.NMS.Stomp действительно есть транспорт аварийного переключения, который будет вызывать прерванные и возобновленные методы, однако при использовании аварийного переключения вам не нужно об этом заботиться, так как транспортный резервный сервер будет иметь дело с повторным подключением. При использовании прямого TCP-соединения вы увидите только вызванный ExceptionListener, потому что с точки зрения транспорта tcp, после сбоя произошел сбой, поэтому исключение подходит.
Вы можете сделать общее предположение, что, когда ваш клиент получает обратный вызов на своем прослушивателе ExceptionListener, что состояние соединения не удалось, и выполните любое повторное соединение, в котором вы нуждаетесь, хотя, если вы используете транспорт для отработки отказа, он будет обработан для вас, поэтому никакой работы не требуется с вашей стороны.