如何使用NMS API删除/删除ActiveMQ订阅服务器

如何使用NMS API删除/删除ActiveMQ订阅服务器,activemq,subscriber,apache-nms,Activemq,Subscriber,Apache Nms,我需要删除我的主题订阅服务器。我找到了这个 然而,这对我们来说还不够好。我们希望控制删除订户的时间,无论是否有任何消息。此外,我们的程序是由C#编写的。因此,我们最好的解决方案是NMS API 谢谢 这是代码 Apache.NMS.ActiveMQ.ConnectionFactory factory = new Apache.NMS.ActiveMQ.ConnectionFactory(m_brokerURI); m_connection = factory.CreateConnection(

我需要删除我的主题订阅服务器。我找到了这个
然而,这对我们来说还不够好。我们希望控制删除订户的时间,无论是否有任何消息。此外,我们的程序是由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
}

更新

我们的情况很简单

  • 客户机构建了一个队列并订阅了一个主题的使用者
  • 客户端关闭了连接
  • 删除服务器端的使用者(如上次更新中的示例代码)
  • 以下是通过jconsole创建的activemq代理的快照:

    我们希望通过以下方法删除订阅服务器“7B0FD84D-6A2A-4921-967F-92B215E22751”, 但总是出现以下错误“javax.jms.InvalidDestinationException:不存在以下持久订阅:7B0FD84D-6A2A-4921-967F-92B215E22751”


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


    在示例代码中,您没有在连接上设置客户端Id。使用持久订阅时,必须始终使用相同的客户端Id和订阅名称。因此,在您将客户端Id设置为与最初创建订阅的连接相同的值之前,您将收到此错误

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


    在示例代码中,您没有在连接上设置客户端Id。使用持久订阅时,必须始终使用相同的客户端Id和订阅名称。因此,在您将客户端Id设置为与最初创建订阅的连接相同的值之前,您将收到此错误

    我们总是会遇到这样的错误:“javax.jms.InvalidDestinationException:没有持久订阅存在于:31E8E994-7276-4E4A-8F18-EA507448535E”。我们使用GUID作为订户名称,并从JConsole复制了该名称。所以这不应该是一个打字错误的问题。我们还使客户端脱机,因此它应该是您提到的非活动订阅服务器。我们错过了什么吗?我的魔法八号球说,所有的符号都指向我代码。那个小片段并没有告诉我什么。您应该发布一个完整的测试用例,或者创建一个演示问题的单元测试,并创建一个Jira问题。该错误表示该订阅上还剩下一个使用者,因此请确保先调用consumer.close()。它可以工作!我们以前不知道需要Clinet Id。谢谢。我们总是会遇到这样的错误:“javax.jms.InvalidDestinationException:不存在31E8E994-7276-4E4A-8F18-EA507448535E的持久订阅”。我们使用GUID作为订户名称,并从JConsole复制了该名称。所以这不应该是一个打字错误的问题。我们还使客户端脱机,因此它应该是您提到的非活动订阅服务器。我们错过了什么吗?我的魔法八号球说,所有的符号都指向我代码。那个小片段并没有告诉我什么。您应该发布一个完整的测试用例,或者创建一个演示问题的单元测试,并创建一个Jira问题。该错误表示该订阅上还剩下一个使用者,因此请确保先调用consumer.close()。它可以工作!我们以前不知道需要Clinet Id。谢谢。strQueueName使我相信您传递的是队列名称,而不是持久订阅者的订阅名称。更新了我的答案以反映我对代码的审阅。strQueueName使我相信您传递的是队列名称,而不是持久订阅者的订阅名称。更新了我的答案以反映我的请求审查守则。
    strSubscriberName = “7B0FD84D-6A2A-4921-967F-92B215E22751”
    session.DeleteDurableConsumer(strSubscriberName);