使用容器工厂
引入监听容器工厂是为了支持 @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 自动配置提供的那个),或两者兼而有之,这些技术会很有用。
important
以这种方式创建的容器是普通的 @Bean 实例,不会注册到 RabbitListenerEndpointRegistry 中。