Spring RabbitMQ SimpleRabbitListenerContainerFactory 用法

Spring RabbitMQ SimpleRabbitListenerContainerFactory usage

docs 开始,我想通过动态更改消费者而不重新启动应用程序来使用来自队列的消费。

我确实看到 Spring RabbitMQ 最新版本支持相同,但没有 clue/example/explanation 更改相同。我看不到相同的正确源代码或如何传递 maxConcurrentConsumers

之类的参数

我正在使用基于 XML 的 Spring RabbitMQ 配置以及 Spring 集成

<bean id="rabbitListenerContainerFactory"
      class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory">
    <property name="connectionFactory" ref="rabbitConnectionFactory"/>
    <property name="concurrentConsumers" value="3"/>
    <property name="maxConcurrentConsumers" value="10"/>
    <property name="acknowledgeMode" value="AUTO" />
</bean>

<int-amqp:inbound-channel-adapter channel="lowInboundChannel" queue-names="lowLoadQueue" advice-chain="retryInterceptor" acknowledge-mode="AUTO" listener-container="rabbitListenerContainerFactory" />
<int-amqp:inbound-channel-adapter channel="highInboundChannel" queue-names="highLoadQueue" advice-chain="retryInterceptor" acknowledge-mode="AUTO" listener-container="rabbitListenerContainerFactory" />

谁能指导我如何动态配置消费者?

首先,您不应该为不同的 <int-amqp:inbound-channel-adapter> 共享相同的 rabbitListenerContainerFactory,因为他们这样做:

protected void onInit() {
    this.messageListenerContainer.setMessageListener(new ChannelAwareMessageListener() { 

因此,只有最后一个适配器获胜。 从另一方面看,甚至没有理由拥有多个适配器。您可以为单个适配器指定 queue-names="highLoadQueue,lowLoadQueue"。 尽管在 listener-container 的情况下,您必须在 SimpleRabbitListenerContainerFactory 上指定 queues

如果您想在运行时更改一些 rabbitListenerContainerFactory 选项,您可以将它注入到某个服务并调用它的 setters.

如果我遗漏了什么,请告诉我。