【问题标题】:RabbitMQ: prefetched messages processingRabbitMQ:预取消息处理
【发布时间】:2014-10-24 10:25:09
【问题描述】:

我正在使用 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) 方法。

我应该注意,处理的顺序对我来说并不重要。只是他们一次处理一个。

提前致谢。

【问题讨论】:

    标签: spring rabbitmq messaging amqp


    【解决方案1】:

    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 Docsjavadoc 中的更多信息SimpleMessageListenerContainer

    【讨论】:

    • 感谢您的回答。但是,当使用并发 > 1 时,每个消费者线程有 1000 条预取消息。这意味着并发参数不一定定义一个线程中预取消息的行为。
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多