此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring AMQP 3.2.6spring-doc.cadn.net.cn

启用侦听器端点注释

启用对@RabbitListener注释,您可以添加@EnableRabbit给你的一个@Configuration类。 以下示例显示了如何执行此作:spring-doc.cadn.net.cn

@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实例。spring-doc.cadn.net.cn

有关帮助您在SimpleRabbitListenerContainerFactoryDirectRabbitListenerContainerFactory,请参阅选择容器

从 2.2.2 版开始,您可以提供ContainerCustomizer实现(如上图所示)。 这可用于在创建和配置容器后进一步配置容器;例如,您可以使用它来设置容器工厂未公开的属性。spring-doc.cadn.net.cn

版本 2.4.8 提供了CompositeContainerCustomizer适用于您希望应用多个定制器的情况。spring-doc.cadn.net.cn

默认情况下,基础架构会查找名为rabbitListenerContainerFactory作为工厂用于创建消息侦听器容器的源。 在这种情况下,忽略 RabbitMQ 基础设施设置,processOrder可以使用三个线程的核心轮询大小和 10 个线程的最大池大小来调用方法。spring-doc.cadn.net.cn

您可以自定义要用于每个注解的监听器容器工厂,也可以通过实现RabbitListenerConfigurer接口。 仅当注册了至少一个端点而没有特定的容器工厂时,才需要默认值。 有关完整的详细信息和示例,请参阅 Javadocspring-doc.cadn.net.cn

容器工厂提供了添加MessagePostProcessor在接收消息后(在调用侦听器之前)和发送回复之前应用的实例。spring-doc.cadn.net.cn

有关回复的信息,请参阅回复管理spring-doc.cadn.net.cn

从 2.0.6 版本开始,您可以添加RetryTemplateRecoveryCallback到侦听器容器工厂。 在发送回复时使用它。 这RecoveryCallback在重试用尽时调用。 您可以使用SendRetryContextAccessor从上下文中获取信息。 以下示例显示了如何执行此作:spring-doc.cadn.net.cn

factory.setRetryTemplate(retryTemplate);
factory.setReplyRecoveryCallback(ctx -> {
    Message failed = SendRetryContextAccessor.getMessage(ctx);
    Address replyTo = SendRetryContextAccessor.getAddress(ctx);
    Throwable t = ctx.getLastThrowable();
    ...
    return null;
});

如果您更喜欢 XML 配置,可以使用<rabbit:annotation-driven>元素。 任何用@RabbitListener被检测到。spring-doc.cadn.net.cn

SimpleRabbitListenerContainer实例中,您可以使用类似于以下内容的 XML:spring-doc.cadn.net.cn

<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:spring-doc.cadn.net.cn

<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 表达式 (#{…​}) 和属性占位符 (${…​}). 其含义和允许的值取决于容器类型,如下所示:spring-doc.cadn.net.cn

  • 对于DirectMessageListenerContainer,则该值必须是单个整数值,该值将consumersPerQueue容器上的属性。spring-doc.cadn.net.cn

  • 对于SimpleRabbitListenerContainer,该值可以是单个整数值,该值将concurrentConsumers属性,或者它可以具有m-n哪里mconcurrentConsumersproperty 和nmaxConcurrentConsumers财产。spring-doc.cadn.net.cn

无论哪种情况,此设置都会覆盖出厂设置。 以前,如果您的侦听器需要不同的并发性,则必须定义不同的容器工厂。spring-doc.cadn.net.cn

注释还允许覆盖工厂autoStartuptaskExecutor属性通过autoStartupexecutor(自 2.2 起)注释属性。 为每个执行器使用不同的执行器可能有助于识别日志和线程转储中与每个侦听器关联的线程。spring-doc.cadn.net.cn

2.2 版还添加了ackMode属性,它允许您覆盖容器工厂的acknowledgeMode财产。spring-doc.cadn.net.cn

@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);
}