使用容器工厂

引入监听器容器工厂是为了支持 @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 中。