【问题标题】:Purge Artemis ActiveMQServer queues in Java在 Java 中清除 Artemis ActiveMQServer 队列
【发布时间】:2019-04-24 03:21:11
【问题描述】:

我在集成测试中有一个ActiveMQServerImpl 实例,在我的SetUp 方法中我想清除服务器中的所有队列。我似乎找不到任何可以做到这一点的方法。出于性能原因,我想避免为每个测试重新创建 Artemis 服务器 bean。我只是错过了什么吗?

我都试过了:

System.out.println(testBroker.locateQueue(new SimpleString(queueName)).deleteAllReferences()); 
System.out.println(testBroker.locateQueue(new SimpleString(queueName)).getMessageCount()); 

和:

((QueueControl)testBroker.getManagementService().getResource(ResourceNames.QUEUE + queueName)).removeMessages(""); 
((QueueControl)testBroker.getManagementService().getResource(ResourceNames.QUEUE + queueName)).countMessages(""); 

两者都显示消息计数没有变化,我继续看到消息通过我的 @JMSListener 注释方法。

【问题讨论】:

  • 您是否在尝试清除队列之前停止您的客户端? org.apache.activemq.artemis.core.server.Queue#getDeliveringCount() 返回什么?
  • getMessageCount() 返回的结果相同。所以我想我只需要在调用 deleteAllReferences() 之前停止 jms 客户端?
  • getMessageCount() 包括正在传递的消息(这意味着它们已发送到客户端但尚未被客户端确认)。 deleteAllReferences()removeMessages() 不会删除正在传递的消息。您应该停止所有客户端(例如断开他们的连接),以便将消息取消回队列,然后可以将其删除。

标签: java activemq-artemis


【解决方案1】:

没有 API 调用来清除代理中的所有队列。一种方法是从 ActiveMQServerControl 获取所有队列名称,查找队列,并在所有队列上调用 deleteAllReferences(),例如:

for (String queueName : server.getActiveMQServerControl().getQueueNames()) {
   Queue queue = server.locateQueue(SimpleString.toSimpleString(queueName));
   if (queue != null) {
      queue.deleteAllReferences();
   }
}

确保在执行此代码时停止您的所有客户端,否则“正在传递”的消息(即已发送到客户端但尚未得到客户端确认的消息)将不会被删除。

【讨论】:

  • 嗯,我的 JmsListener 还在接收上一个测试的消息。运行 deleteAllReferences() 后,deleteAllReferences() 返回 0,getMessageCount() 返回 > 0。我会用更多信息更新我的问题。
  • 我尝试在JmsListenerEndpointRegistry 之前在deleteAllReferences() 上调用stop(),但行为是相同的。
  • 我不确定JmsListenerEndpointRegistry.stop() 与底层 JMS 连接/会话/消费者实现的关系如何。在您调用 stop() 之后,getDeliveringCount() 会说什么? getConsumerCount() 说什么?
  • 是的,根据getConsumerCount,它似乎不会导致消费者被删除。寻找另一种方式..
  • 我对 Spring 不够熟悉,无法回答这个问题。正如我之前提到的,我不确定JmsListenerEndpointRegistry.stop() 与底层 JMS 连接/会话/消费者实现的关系如何。我建议您就此提出一个新问题并将其标记为 spring-jms 或放弃 Spring 并仅使用 JMS API。值得一提的是,JMS API 并不复杂。
猜你喜欢
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 2011-05-14
  • 2017-10-15
相关资源
最近更新 更多