如何使用NMS API删除/删除ActiveMQ订阅者

时间:2013-04-22 10:03:39

标签: activemq subscriber apache-nms

我需要删除/删除我的主题订阅者。我发现了http://activemq.apache.org/manage-durable-subscribers.html 但是,这对我们来说还不够好。我们希望控制删除订户的时间,无论是否有任何消息。此外,我们的程序是由C#编写的。因此,对我们来说最好的解决方案是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
}

更新

我们的情景非常简单。

  1. 客户建立了一个队列并为某个主题订阅了消费者。
  2. 客户端关闭了连接。
  3. 删除服务器端的使用者(作为上次更新中的示例代码)
  4. 以下是通过jconsole的activemq代理的快照: jconsole snapshot

    我们想通过以下方法删除订户“7B0FD84D-6A2A-4921-967F-92B215E22751”, 但总是得到这个错误“javax.jms.InvalidDestinationException:不存在持久订阅:7B0FD84D-6A2A-4921-967F-92B215E22751”

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

1 个答案:

答案 0 :(得分:1)

要从NMS API删除持久订阅,请使用ISession中定义的DeleteDurableConsumer方法。您必须从使用与创建订阅时使用的客户端ID相同的客户端ID的Connection调用此方法,并传递要删除的订阅的名称。如果存在活动订户,则该方法将失败,因此请为该异常做好准备。

在示例代码中,您未在连接上设置客户端ID。使用持久订阅时,您必须始终使用相同的客户端ID和订阅名称。因此,在您将同样的情况下,您将获得此错误,直到您将客户端ID设置为与首先创建订阅的连接相同的值。