Using Container Factories

引入了侦听器容器工厂,以支持 `@RabbitListener`并使用 `RabbitListenerEndpointRegistry`注册容器,如 Programmatic Endpoint Registration中所述。

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

创建这种容器有两种方法:

  • Use a 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 中注册。