2013-04-22 2 views
1

Мне нужно удалить/удалить моего абонента темы. Я нашел это http://activemq.apache.org/manage-durable-subscribers.html
Однако, это не достаточно для нас. Мы хотим контролировать время удаления подписчика, и независимо от того, есть какие-либо сообщения или нет. Кроме того, наша программа написана C#. Поэтому лучшим решением для нас является NMS API.Как удалить/удалить подписчика ActiveMQ с помощью NMS API

Спасибо.


Вот код,

Apache.NMS.ActiveMQ.ConnectionFactory factory = new Apache.NMS.ActiveMQ.ConnectionFactory(m_brokerURI); 
m_connection = factory.CreateConnection(username, password); 

Apache.NMS.ActiveMQ.Connection con = (Apache.NMS.ActiveMQ.Connection)m_connection; 
ISession session = m_connection.CreateSession(AcknowledgementMode.AutoAcknowledge); 

try 
{ 
    session.DeleteDurableConsumer(strQueueName); 
} 
catch (Exception ex) 
{ 
    // log the error message 
} 

Update

Наш сценарий довольно прост.

  1. Клиент построил очередь и подписался на потребителя по теме.
  2. клиентская сторона закрыла соединение.
  3. удалить потребитель на стороне сервера (в качестве примера кода в последнем обновлении)

Вот снимок ActiveMQ брокера через JConsole: jconsole snapshot

Мы хотели бы, чтобы удалить подписчик « 7B0FD84D-6A2A-4921-967F-92B215E22751” по следующему методу, Но всегда получил эту ошибку "javax.jms.InvalidDestinationException: нет долговечны подписки не существует для: 7B0FD84D-6A2A-4921-967F-92B215E22751"

strSubscriberName = “7B0FD84D-6A2A-4921-967F-92B215E22751” 
session.DeleteDurableConsumer(strSubscriberName); 
+0

strQueueName приводит меня к мысли, что вы передаете имя очереди, а не подписное имя прочного абонента. –

+0

Обновлен мой ответ, чтобы отразить мой обзор кода. –

ответ

1

Чтобы удалить долговременную подписку из NMS API, вы используете метод DeleteDurableConsumer, определенный в ISession. Вы должны вызвать этот метод из Connection, который использует тот же идентификатор клиента, который использовался при создании подписки, и вы передаете имя подписки, которая должна быть удалена. Метод будет терпеть неудачу, если есть активный абонент, хотя поэтому будьте готовы к этому исключению.

В образце кода вы не устанавливаете идентификатор клиента в соединении. При работе с надежными подписками вы должны обязательно должны использовать один и тот же идентификатор клиента и имя подписки. Таким образом, вы тоже получите эту ошибку, пока не установите идентификатор клиента на то же значение, что и соединение, которое создало подписку в первую очередь.

+0

У нас всегда возникала такая ошибка: «javax.jms.InvalidDestinationException: нет надежной подписки для: 31E8E994-7276-4E4A-8F18-EA507448535E». Мы используем GUID в качестве имени подписчика, и мы скопировали имя из JConsole. Поэтому это не должно быть проблемой опечатки. Мы также не подключаем клиента к клиенту, поэтому он должен быть неактивным абонентом, как вы упомянули. Мы что-то скучаем? –

+1

My magic eight ball говорит, что все признаки указывают на код. –

+0

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

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