使用容器工厂

正如在程序化端点注册中所述,引入监听器容器工厂是为了支持@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中注册。