每 15 条 JMS 消息卡在队列中,直到第 1 条消息完成
Posted
技术标签:
【中文标题】每 15 条 JMS 消息卡在队列中,直到第 1 条消息完成【英文标题】:every 15th JMS message stuck in queue till 1st message finishes 【发布时间】:2014-02-27 06:05:12 【问题描述】:我们面临一个问题,在 MDB 实例没有完成对第一条消息的处理之前,不会从消息队列中读取每 15 条消息。
消息的生存时间为 30 秒。如果第一次消息消费花费的时间比这多得多,那么卡住的消息会在队列中停留超过 30 秒,因此当缓慢的消息消费停止时会超时。
MDB 池大小为 20,但尝试了 30、10、... 没有区别。
场景如下:
#1 SLOW 消息进入队列,调用 MDB onMessage(),消息处理。
#2-14 消息进入队列,调用 MDB onMessage(),处理消息。
#15 消息进入队列,消息未被触及。
#16-29 消息进入队列,MDB onMessage() 被调用,消息被处理。
#30 消息进入队列,消息未被触及。
...每 15 次卡住一次
#1 结束,然后由于消息超时,每 15 条消息(卡住)立即被丢弃。
总是每 15 条消息...
我们正在使用 JBOSS EAP 6.1 并使用 JAVA 7
谁能给我们一些关于这个问题的提示,可能是什么原因,在哪里寻找?必须将某些东西配置为 15 导致此问题,但我们不知道它可能是什么。
提前致谢!
【问题讨论】:
也许这与某些批处理功能有关? 我不知道您的邮件是如何优先级排序的。但是,对于慢速消息,如何将 JMSPriority 设置为低呢? 不幸的是,以这种方式对消息进行优先级排序是行不通的,因为如果 MDB 试图访问的后端存在服务问题,则消息速度很慢。而且我们已经有一个优先策略,目前对所有消息都是平等的。可能是一些批量消耗,但我真的不知道在哪里看 经过更彻底的测试后,我已经编辑了问题 嗨,你能告诉我在哪里可以找到队列中发送的消息吗?如果有的话。谢谢。 【参考方案1】:我已经解决了这个问题。
这是因为hornetq基于窗口的流量控制。
这篇文章包含解决方案: JMS queue with multiple consumers
【讨论】:
以上是关于每 15 条 JMS 消息卡在队列中,直到第 1 条消息完成的主要内容,如果未能解决你的问题,请参考以下文章