跳到主要内容
版本:4.1.1

启用监听端点注解

Doubao 中英对照 Enable Listener Endpoint Annotations

要启用对 @RabbitListener 注解的支持,你可以在其中一个 @Configuration 类上添加 @EnableRabbit。下面的示例展示了如何这样做:

@Configuration
@EnableRabbit
public class AppConfig {

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrentConsumers(3);
factory.setMaxConcurrentConsumers(10);
factory.setContainerCustomizer(container -> /* customize the container */);
return factory;
}
}

从 2.0 版开始,还提供了 DirectMessageListenerContainerFactory。它创建 DirectMessageListenerContainer 实例。

备注

有关帮助你在 SimpleRabbitListenerContainerFactory 和 DirectRabbitListenerContainerFactory 之间做出选择的信息,请参阅选择容器。

从 2.2.2 版开始,你可以提供一个 ContainerCustomizer 实现(如上所示)。它可用于在容器创建并配置之后对其做进一步配置;例如,你可以用它来设置容器工厂未暴露的属性。

2.4.8 版提供了 CompositeContainerCustomizer,适用于你希望应用多个定制器的场景。

默认情况下,基础架构会查找一个名为 rabbitListenerContainerFactory 的 bean,作为用于创建消息监听容器的工厂来源。在本例中(忽略 RabbitMQ 基础架构的设置),可以用三个线程的核心轮询大小和十个线程的最大池大小来调用 processOrder 方法。

你可以为每个注解定制所使用的监听容器工厂,也可以通过实现 RabbitListenerConfigurer 接口来配置一个显式默认值。仅当至少注册了一个未指定特定容器工厂的端点时,才需要这个默认值。完整细节和示例请参阅 Javadoc。

容器工厂提供了添加 MessagePostProcessor 实例的方法,这些实例在接收到消息之后(调用监听器之前)以及发送回复之前应用。

有关回复的信息,请参阅回复管理。

从 2.0.6 版开始,你可以向监听容器工厂添加 RetryTemplate 和 RecoveryCallback。它在发送回复时使用。当重试耗尽时会调用 RecoveryCallback。

如果你更喜欢 XML 配置,可以使用 <rabbit:annotation-driven> 元素。任何带有 @RabbitListener 注解的 bean 都会被检测到。

对于 SimpleRabbitListenerContainer 实例,你可以使用类似下面的 XML:

<rabbit:annotation-driven/>

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

对于 DirectMessageListenerContainer 实例,你可以使用类似下面的 XML:

<rabbit:annotation-driven/>

<bean id="rabbitListenerContainerFactory"
class="org.springframework.amqp.rabbit.config.DirectRabbitListenerContainerFactory">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="consumersPerQueue" value="3"/>
</bean>

从 2.0 版开始,@RabbitListener 注解新增了一个 concurrency 属性。它支持 SpEL 表达式(#{…​})和属性占位符(${…​})。其含义和允许的值取决于容器类型,如下所示:

  • 对于 DirectMessageListenerContainer,该值必须是单个整数值,用于设置容器上的 consumersPerQueue 属性。
  • 对于 SimpleRabbitListenerContainer,该值可以是单个整数值,用于设置容器上的 concurrentConsumers 属性;也可以采用 m-n 的形式,其中 m 是 concurrentConsumers 属性,n 是 maxConcurrentConsumers 属性。

无论哪种情况,此设置都会覆盖工厂上的设置。此前,如果你的监听器需要不同的并发度,就必须定义不同的容器工厂。

该注解还允许通过 autoStartup 和 executor(自 2.2 起)注解属性覆盖工厂的 autoStartup 和 taskExecutor 属性。为每个监听器使用不同的执行器,可能有助于在日志和线程转储中识别与各监听器关联的线程。

2.2 版还增加了 ackMode 属性,它允许你覆盖容器工厂的 acknowledgeMode 属性。

@RabbitListener(id = "manual.acks.1", queues = "manual.acks.1", ackMode = "MANUAL")
public void manual1(String in, Channel channel,
@Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {

...
channel.basicAck(tag, false);
}