Spring Boot 中的 @RabbitListenerContainerFactory 注解
1. 什么是 @RabbitListenerContainerFactory
在 Spring Boot 中,我们可以使用 @RabbitListener 注解来监听 RabbitMQ 中的消息。@RabbitListener 注解会自动创建一个监听器容器,用于接收和处理消息。默认情况下,Spring Boot 使用 SimpleRabbitListenerContainerFactory 来创建监听器容器。如果我们需要自定义监听器容器,可以使用 @RabbitListenerContainerFactory 注解。
@RabbitListenerContainerFactory 注解是一个用于创建 RabbitMQ 监听器容器工厂的注解。它可以用于自定义监听器容器的配置,例如线程池大小、消息确认机制、消息转换器等。

2. @RabbitListenerContainerFactory 的原理
在 Spring Boot 中,@RabbitListenerContainerFactory 注解是通过 RabbitListenerAnnotationBeanPostProcessor 来实现的。RabbitListenerAnnotationBeanPostProcessor 是一个 Bean 后置处理器,它会扫描所有带有 @RabbitListener 注解的方法,并根据 @RabbitListener 注解的属性来创建监听器容器。如果一个方法使用了自定义的 @RabbitListenerContainerFactory 注解,那么 RabbitListenerAnnotationBeanPostProcessor 将会使用这个注解来创建监听器容器工厂。
在创建监听器容器工厂时,Spring Boot 会根据 @RabbitListenerContainerFactory 注解的属性来配置监听器容器。例如,如果我们需要开启消息确认机制,可以在 @RabbitListenerContainerFactory 注解中设置 acknowledgeMode 属性为 AcknowledgeMode.AUTO。
3. 如何使用 @RabbitListenerContainerFactory
3.1. 使用默认的监听器容器工厂
当我们使用 @RabbitListener 注解时,Spring Boot 默认会使用 SimpleRabbitListenerContainerFactory 来创建监听器容器。如果我们不需要对监听器容器进行自定义配置,可以直接在方法上添加 @RabbitListener 注解,例如:
@RabbitListener(queues = "myQueue")
public void processMessage(String message) {
// 处理消息
}
在这个示例中,我们使用 @RabbitListener 注解来监听名为 myQueue 的队列,并在 processMessage 方法中处理接收到的消息。
3.2. 自定义监听器容器工厂
如果我们需要自定义监听器容器,可以使用 @RabbitListenerContainerFactory 注解来创建自定义的监听器容器工厂。以下是一个自定义监听器容器工厂的示例代码:
@Configuration
public class MyRabbitListenerContainerFactory {
@Bean(name = "myFactory")
public SimpleRabbitListenerContainerFactory myFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setConcurrentConsumers(3);
factory.setMaxConcurrentConsumers(10);
factory.setAcknowledgeMode(AcknowledgeMode.AUTO);
return factory;
}
@Bean(name = "myListener")
public MessageListenerAdapter myListener() {
return new MessageListenerAdapter(new MyMessageListener());
}
@Bean
public SimpleMessageListenerContainer myContainer(ConnectionFactory connectionFactory, @Qualifier("myListener") MessageListenerAdapter listenerAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames("myQueue");
container.setMessageListener(listenerAdapter);
container.setAcknowledgeMode(AcknowledgeMode.AUTO);
container.setConcurrency("3-10");
return container;
}
}
在这个示例中,我们使用 @RabbitListenerContainerFactory 注解来创建一个名为 myFactory 的自定义监听器容器工厂。我们在 myFactory 中设置了一些监听器容器的属性,例如线程池大小、消息确认机制等。
接着,我们使用 @Bean 注解来创建一个名为 myListener 的消息监听器,并将其设置到 SimpleMessageListenerContainer 中。最后,我们使用 @Bean 注解来创建一个名为 myContainer 的自定义监听器容器,将其绑定到 myQueue 队列上,并使用 myListener 作为消息监听器。
在使用自定义监听器容器时,我们需要在 @RabbitListener 注解中指定使用的工厂名称,例如:
@RabbitListener(queues = "myQueue", containerFactory = "myFactory")
public void processMessage(String message) {
// 处理消息
}
在这个示例中,我们在 @RabbitListener 注解中指定了使用 myFactory 工厂来创建监听器容器,从而使用自定义的监听器容器。
4. 总结
@RabbitListenerContainerFactory 注解是一个用于创建 RabbitMQ 监听器容器工厂的注解。它可以用于自定义监听器容器的配置,例如线程池大小、消息确认机制、消息转换器等。在使用自定义监听器容器时,我们需要在 @RabbitListener 注解中指定使用的工厂名称。使用 @RabbitListenerContainerFactory 注解能够帮助我们更好地管理 RabbitMQ 监听器容器,从而提高应用程序的性能和可维护性。










![[MySQL]1292 - Incorrect date value: ‘0000-00-00‘ for column ‘xxx‘ at row 1](https://img-blog.csdnimg.cn/10bdbdf7c77e45348efa65b4e0b79d0d.png)








