我的理解是,ActiveMQ的默认行为是对消费者进行消息的异步调度,但是当我尝试通过在Thread.sleep(60000);
中执行MessageListener#onMessage()
来测试它时,然后经纪人无法发送排队的消息,直到它收到上一封消息的发送确认。
所以,然后我尝试显式设置async标志,以防万一,使用((ActiveMQConnectionFactory)connectionFactory).setDispatchAsync(true);
提到here,但仍然是相同的行为。
有没有办法可以确保我的ActiveMQ经纪人不被阻止,如果其中一个消费者需要很长时间,请注意我知道并阅读“慢消费者”但这不是我的意思想要,我想要一个真正的异步调度,其中代理发送消息的地方不等待任何确认/响应。
修改
我刚刚阅读了what-is-the-prefetch-limit-for,我想知道当经纪人同步向消费者发送消息时,那么“预取限制”是什么意思?
答案 0 :(得分:1)
使用默认配置,ActiveMQ配置为每个队列使用一个调度线程 - 您可以使用在目标策略条目{ - 3}}上设置optimizedDispatch属性。
在activemq.xml中设置optimizedDispatch =“true”
optimizedDispatch:
默认值:false
说明:请勿使用单独的线程从队列中进行调度。
注意做一个Thread.sleep(60000);在MessageListener#onMessage()中,当使用单个消费者时,消费者的调度员无法发送另一封消息。
<强>更新强>
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" optimizedDispatch="true"/>
<policyEntries>
<policyMap>
<destinationPolicy>
队列= “&gt;” 中表示所有队列
OP编辑(hagrawal):为了帮助未来的访问者快速掌握这个概念,我将其置于坚果壳的核心概念之下,请随时阅读下面的所有评论以便了解更多。非常感谢@HassenBennour澄清这一切。
如果有2个消费者已连接并且消息已生成 它会对那些消费者进行知更圆的消息调度,但是 假设没有消费者连接,经纪人有4条消息入队,a 消费者连接3作为预取限制然后它将提供3 给消费者的消息然后等待,同时如果其他的话 消费者获得连接然后它会立即发送第4条消息 否则它将等待第一条消息的确认 在向同一消费者发送第4条消息之前。