使用容器工厂
引入监听器容器工厂是为了支持 @RabbitListener
和在 RabbitListenerEndpointRegistry
中注册容器,如 程序化端点注册 中所讨论的。
从 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);
}
以下示例展示了如何在创建后添加监听器:
@Bean
public SimpleMessageListenerContainer factoryCreatedContainerNoListener(
SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory) {
SimpleMessageListenerContainer container = rabbitListenerContainerFactory.createListenerContainer();
container.setMessageListener(message -> {
...
});
container.setQueueNames("test.no.listener.yet");
return container;
}
在任何一种情况下,监听器也可以是 ChannelAwareMessageListener
,因为它现在是 MessageListener
的子接口。
如果你希望创建具有相似属性的多个容器,或者使用预配置的容器工厂(例如 Spring Boot 自动配置提供的工厂),或者两者兼而有之,这些技术将非常有用。
以这种方式创建的容器是普通的 @Bean
实例,并且未在 RabbitListenerEndpointRegistry
中注册。