Apache NMS - как определить, установлено ли соединение - PullRequest
2 голосов
/ 23 февраля 2012

У меня чертовски много времени с некоторыми проблемами 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 Ответ

4 голосов
/ 26 февраля 2012

В клиенте Apache.NMS.Stomp действительно есть транспорт для отработки отказа, который будет вызывать прерванные и возобновленные методы, однако при использовании отработки отказа вам на самом деле не нужно заботиться о них, поскольку транспорт для отработки отказа будет иметь дело с повторным подключением. При использовании прямого TCP-соединения вы увидите только вызванный ExceptionListener, потому что с точки зрения транспорта tcp, после его сбоя произошел сбой, поэтому исключение подходит.

Вы можете сделать общее предположение, что, когда ваш клиент получает обратный вызов на своем прослушивателе ExceptionListener, что состояние соединения не удалось, и сделайте все необходимое для повторного соединения, хотя, если вы используете транспорт для отработки отказа, он будет обработан для вас, поэтому с вашей стороны работа не требуется.

...