java - HornetQ:从队列中删除所有消息,不适用于队列中的消费者

标签 java spring jms wildfly hornetq

我有一个简单的测试用例,我在其中启动了一个 HornetQ 服务器 (V2.4.7.Final) 作为 Spring 上下文的一部分。这很好用,我可以通过 JMS、HornetQ API 和/或 JMX 访问队列。

测试用例

测试用例应该在开始时清空队列,检查它是否为空,然后将 10 条消息添加到队列中。只要此队列上没有消费者,就可以使用 management queueJMSQueueControl。即使通过 JMX 对队列做一些操作也很好。

问题描述

一旦我使用 Spring 配置向此队列添加消息监听器 - 并且监听器按预期使用消息 - 我无法从队列中删除所有消息。通过 JMX 进行的方法调用、管理队列和 JMSQueueControl 都不起作用,即方法被无异常地调用,但它们没有任何效果。

我想也许我必须在对其内容进行一些修改之前暂停队列,但暂停也不起作用。我可以看到队列是通过 JMX 暂停的,并且在使用 API 时报告了同样的情况,但消费者仍然使用队列中的消息。因此我认为它根本没有被暂停。

我知道没有源代码很难,但从我的角度来看,这都是非常基本的设置,你可以在很多很多教程中找到它。任何人都可以提供建议我做错了什么。如果需要任何源代码,请发表评论,我会添加相关部分。

最佳答案

HornetQ 支持删除代理端队列中的消息。一旦消息被分派(dispatch)给消费者并在消费者上缓冲,就无法使用任何管理 API 从消费者缓冲区中删除消息。

解决此问题的一种方法(如果必须)是通过将 consumer-window-size 设置为 0 来禁用消费者缓冲,但请注意潜在的性能下降。

否则,您需要以编程方式处理它;通过在处理消息之前添加一些有效性检查。

您可以在此处阅读有关 HornetQ 流量控制的更多信息 https://docs.jboss.org/hornetq/2.2.5.Final/user-manual/en/html/flow-control.html

关于java - HornetQ:从队列中删除所有消息,不适用于队列中的消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34928606/

相关文章:

java - 服务器启动的监听器和所有 spring bean 完全加载

java - 由于 "received expired message",无法使用来自 ActiveMQ 的消息

java - 为什么不允许我使用 Tibco Rendezvous 确认消息?

java - 如何查找远程 JNDI

java - Maven 未将 JAR 添加到 eclipse 项目

java - 扫描android中的文件夹以获取文件路径

java - OrientDB ETL导入: 'skip' operator throws exception

java - 为什么 PermGen 的默认大小这么小?

spring 依赖管理 gradle 插件不下载依赖

java - Solace 不确认之前的消息是否违反了 JMS 规范?