无法对消费者执行异步调度并了解“预取限制”是如何相关的

时间:2017-04-20 14:10:45

标签: asynchronous jms activemq

我的理解是,ActiveMQ的默认行为是对消费者进行消息的异步调度,但是当我尝试通过在Thread.sleep(60000);中执行MessageListener#onMessage()来测试它时,然后经纪人无法发送排队的消息,直到它收到上一封消息的发送确认。

所以,然后我尝试显式设置async标志,以防万一,使用((ActiveMQConnectionFactory)connectionFactory).setDispatchAsync(true);提到here,但仍然是相同的行为。

有没有办法可以确保我的ActiveMQ经纪人不被阻止,如果其中一个消费者需要很长时间,请注意我知道并阅读“慢消费者”但这不是我的意思想要,我想要一个真正的异步调度,其中代理发送消息的地方不等待任何确认/响应。

修改
我刚刚阅读了what-is-the-prefetch-limit-for,我想知道当经纪人同步向消费者发送消息时,那么“预取限制”是什么意思?

1 个答案:

答案 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条消息之前。