跳到主要内容

使用容器工厂

DeepSeek V3 中英对照 Using Container Factories

为了支持 @RabbitListener 和通过 RabbitListenerEndpointRegistry 注册容器,引入了监听器容器工厂(Listener container factories),正如在编程式端点注册中讨论的那样。

从 2.1 版本开始,它们可以用来创建任何监听器容器——甚至是一个没有监听器的容器(例如用于 Spring Integration 中)。当然,在容器启动之前必须添加监听器。

有两种方法可以创建这样的容器:

  • 使用 SimpleRabbitListenerEndpoint

  • 在创建后添加监听器

以下示例展示了如何使用 SimpleRabbitListenerEndpoint 创建一个监听器容器:

@Bean
public SimpleMessageListenerContainer factoryCreatedContainerSimpleListener(
SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory) {
SimpleRabbitListenerEndpoint endpoint = new SimpleRabbitListenerEndpoint();
endpoint.setQueueNames("queue.1");
endpoint.setMessageListener(message -> {
...
});
return rabbitListenerContainerFactory.createListenerContainer(endpoint);
}
java

以下示例展示了如何在创建后添加监听器:

@Bean
public SimpleMessageListenerContainer factoryCreatedContainerNoListener(
SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory) {
SimpleMessageListenerContainer container = rabbitListenerContainerFactory.createListenerContainer();
container.setMessageListener(message -> {
...
});
container.setQueueNames("test.no.listener.yet");
return container;
}
java

无论是哪种情况,监听器也可以是 ChannelAwareMessageListener,因为它现在是 MessageListener 的子接口。

这些技术在您希望创建具有相似属性的多个容器,或使用预先配置的容器工厂(例如 Spring Boot 自动配置提供的工厂),或者同时使用这两种方法时非常有用。

important

以这种方式创建的容器是普通的 @Bean 实例,不会注册到 RabbitListenerEndpointRegistry 中。