2013-11-26 3 views
1

У меня есть следующий код:ActiveMQ связь с ClientId метания ошибки

_connectionFactory = new Apache.NMS.ActiveMQ.ConnectionFactory(_activeMqSettings.Connection.ServerUrl, "MyApplication"); 
_connection = _connectionFactory.CreateConnection(_activeMqSettings.Connection.UserName, _activeMqSettings.Connection.Password); 
_connection.ConnectionInterruptedListener += _connection_ConnectionInterruptedListener; 
_connection.ConnectionResumedListener += _connection_ConnectionResumedListener; 
_session = _connection.CreateSession(); 

Первое соединение преуспевает, но последующие соединения забросить ошибку:

Broker: localhost - Client: MyApplication already connected from tcp://0:0:0:0:0:0:0:1:39932

этот код нормально работает без идентификатора клиента, но вызывает ошибку. У меня создалось впечатление, что предоставление ClientId будет повторно подключаться к брокеру без создания нового сеанса (так что потребительский счет остается неизменным), но я его неправильно реализую?

Когда я закрыл веб-сайт, а затем перезапустил его, я вижу, что соединение возобновляется при пожаре _connection_ConnectionResumedListener(). Однако мой слушатель не берет никаких новых сообщений.

Есть в любом случае, чтобы получить ручку на сессии, и обновить слушателя, т.е. повторно запустить:

lock (ConsumerLocker) 
{ 
    if (_consumer == null) 
    { 
     _consumer = _session.CreateConsumer(new ActiveMQTopic(_activeMqSettings.Queues.OpsConsole)); 
     _consumer.Listener += new MessageListener(messageReader); 
    } 
} 

ответ

1

Это не совсем понятно, что вы делаете в коде, но я могу уточнить идентификатор клиента биты. Вы должны назначить каждому соединению свой собственный уникальный идентификатор клиента, если вы намерены установить это поле вообще. Любая попытка соединения с использованием одного и того же идентификатора клиента, сделанного после первоначального соединения с этим идентификатором клиента, завершится неудачей до тех пор, пока исходное соединение не будет закрыто вызовом соединения. Close().

Идентификатор клиента обычно используется в Connection, который будет иметь прочную подписку на тему, связанную с ними. Каждое соединение должно иметь уникальный идентификатор клиента, чтобы они могли восстановить долговременную подписку, связанную с соединением, если более чем одному соединению разрешалось иметь тот же идентификатор клиента, который брокер не мог понять, чьи подписки являются чьими.

+1

Спасибо Тим. Что бы вы предложили для веб-сайта, потребляющего очередь? Когда сайт идет вниз (IIS Reset, upgrade, power offage и т. Д.) При возврате, он получает новую сессию. Брокер все еще думает, что старое соединение действительно (я могу видеть, что 2 потребителя прикреплены к очереди), поэтому сообщения теряются, поскольку они все еще увольняются с теперь призрачным соединением. Думаю, тема может быть ответом, но должно быть решение с очередью? – Ben

+0

Почему бы вам не использовать встроенный протокол отказоустойчивости вместо того, чтобы пытаться выполнить свой переход на другой ресурс? –

Смежные вопросы