容器工厂
如 @KafkaListener 注解一节所述,ConcurrentKafkaListenerContainerFactory 用于为注解方法创建容器。
从 2.2 版本开始,你可以使用同一个工厂来创建任意 ConcurrentMessageListenerContainer。如果你想创建若干具有相似属性的容器,或者希望使用某个外部配置的工厂(例如 Spring Boot 自动配置提供的工厂),这会很有用。容器创建之后,你可以进一步修改其属性,其中许多属性是通过 container.getContainerProperties() 设置的。以下示例配置了一个 ConcurrentMessageListenerContainer:
@Bean
public ConcurrentMessageListenerContainer<String, String>(
ConcurrentKafkaListenerContainerFactory<String, String> factory) {
ConcurrentMessageListenerContainer<String, String> container =
factory.createContainer("topic1", "topic2");
container.setMessageListener(m -> { ... } );
return container;
}
important
以这种方式创建的容器不会被添加到端点注册表中。它们应被创建为 @Bean 定义,以便注册到应用程序上下文中。
从 2.3.4 版本开始,你可以向工厂添加一个 ContainerCustomizer,以便在每个容器被创建并配置之后对其进一步配置。
@Bean
public KafkaListenerContainerFactory<?> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
new ConcurrentKafkaListenerContainerFactory<>();
...
factory.setContainerCustomizer(container -> { /* customize the container */ });
return factory;
}
从 3.1 版本开始,还可以通过在 KafkaListener 注解上指定一个 'ContainerPostProcessor' 的 bean 名称,对单个监听器应用同样类型的定制。
@Bean
public ContainerPostProcessor<String, String, AbstractMessageListenerContainer<String, String>> customContainerPostProcessor() {
return container -> { /* customize the container */ };
}
...
@KafkaListener(..., containerPostProcessor="customContainerPostProcessor", ...)