RabbitMQ:预取消息处理

5

我正在使用Spring AMQP与RabbitMQ协作。以下是我的配置:

<rabbit:connection-factory id="connectionFactory"
    host="${queue.host}" port="${queue.port}" />
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" />
<rabbit:admin connection-factory="connectionFactory" />
<rabbit:queue name="${queue.names}" durable="true"
    exclusive="false" />
<rabbit:listener-container
    connection-factory="connectionFactory" acknowledge="auto" error-handler="airbrakeHandler" prefetch="1000" >
    <rabbit:listener ref="consumer" queue-names="${queue.names}" />
</rabbit:listener-container>

正如您所看到的,prefetchCount是1000。

我想知道消费者是否并行处理预取的消息; 也就是说,多个线程调用onMessage(Message message)方法。 还是说这些消息是按顺序依次处理的; 也就是说,一个线程迭代预取的消息,并依次调用每个消息的onMessage(Message message)方法。

需要注意的是,对于我来说,处理的顺序并不重要。只要它们一个接一个地被处理。

提前感谢您的帮助。

1个回答

2
< p > SimpleMessageListenerContainer 的配置包括一个 concurrency 参数,用于设置消费者线程的最大数量:

concurrency: The number of concurrent consumers to start for each listener.

对于单线程操作,您需要将其设置为“1” - 例如:

<rabbit:listener-container ... prefetch="1000" concurrency="1">
    <rabbit:listener ref="consumer" queue-names="${queue.names}" />
</rabbit:listener-container>

更多信息请参考Spring文档SimpleMessageListenerContainerjavadoc


感谢您的回答。然而,当使用并发性>1时,每个消费者线程都有1000个预取的消息。这意味着并发参数不一定定义了一个线程内预取消息的行为。 - Yonatan Wilkof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接