如何使用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
}
更新 我们的情况很简单
要从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);