对于最新稳定版本,请使用Spring AMQP 4.0.0spring-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版本起,aDirectMessageListenerContainerFactory也可获得。 它创造了DirectMessageListenerContainer实例。spring-doc.cadn.net.cn

获取帮助你做出选择的信息SimpleRabbitListenerContainerFactoryDirectRabbitListenerContainerFactory,参见选择容器

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

2.4.8版本提供了CompositeContainerCustomizer适用于你想使用多个自定义器的情况。spring-doc.cadn.net.cn

默认情况下,基础设施会寻找名为兔子听众容器工厂作为工厂创建消息监听器容器的源代码。 在这种情况下,忽略RabbitMQ的基础设施设置,进程顺序该方法可在三线程核心轮询大小和最大十线程池大小下调用。spring-doc.cadn.net.cn

你可以自定义监听器容器工厂以用于每个注释,或者通过实现兔子听众配置器接口。 只有当至少有一个终端注册且没有特定容器工厂时,才需要默认设置。 完整细节和示例请参见 Javadocspring-doc.cadn.net.cn

集装箱工厂提供了添加方法消息后处理器这些实例是在收到消息(调用监听者之前)和发送回复之前应用的。spring-doc.cadn.net.cn

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

从2.0.6版本开始,你可以添加一个重试模板恢复回调去听众集装箱工厂。 它用于发送回复。 这恢复回调当重试用尽时调用。 你可以用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:注释驱动>元素。 任何带有注释的豆子@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注释具有并发财产。 它支持 SpEL 表达式(#{…​})和属性占位符(${…​}). 其含义和允许的值取决于容器类型,具体如下:spring-doc.cadn.net.cn

  • 对于DirectMessageListenerContainer,该值必须是单个整数值,该值设定消费者按队列容器上的财产。spring-doc.cadn.net.cn

  • 对于SimpleRabbitListenerContainer,该值可以是一个整数值,该值可以设置并发消费者容器上的属性,或者它可以有以下形式,M-N哪里m并发消费者性质和nmaxConcurrentConsumers财产。spring-doc.cadn.net.cn

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

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

2.2版本还增加了ack模式属性,允许你覆盖集装箱工厂的承认模式财产。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);
}