使用容器工廠

引入監聽器容器工廠是為了支援 @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 中註冊。