Java 如何重用SpringKafka代码来设置多个侦听器?

Java 如何重用SpringKafka代码来设置多个侦听器?,java,spring-boot,spring-kafka,Java,Spring Boot,Spring Kafka,如果我的应用程序只有一个侦听器,那么情况就非常简单: 我将配置spring.kafka.,spring Boot将把配置解析为kafkaproperties,并初始化所有需要的bean 但我有两个侦听器,一个将记录保存到文件,另一个保存到数据库。我想重复使用尽可能多的春季开机公约 我想配置file.kafka.*和db.kafka.*,将这些配置解析为2个KafkaPropertiesbean: @ConfigurationProperties("file.kafka") @

如果我的应用程序只有一个侦听器,那么情况就非常简单:

我将配置
spring.kafka.
,spring Boot将把配置解析为
kafkaproperties
,并初始化所有需要的bean

但我有两个侦听器,一个将记录保存到文件,另一个保存到数据库。我想重复使用尽可能多的春季开机公约

我想配置
file.kafka.*
db.kafka.*
,将这些配置解析为2个
KafkaProperties
bean:

@ConfigurationProperties("file.kafka")
@Bean(autowireCandidate = false)
KafkaProperties fileKafkaProperties() {
  return new KafkaProperties();
}

@ConfigurationProperties("db.kafka")
@Bean(autowireCandidate = false)
KafkaProperties dbKafkaProperties() {
  return new KafkaProperties();
}
最后分别创建2
ConcurrentKafkaListenerContainerFactory
:db和file

问题在于,要将
kafkaproperties
应用于
ConcurrentKafkListenerContainerFactory
我需要
ConcurrentKafkListenerContainerFactoryConfigurer
。但是,
ConcurrentKafkaListenerContainerFactoryConfigurer
不够公开,无法使用
KafkaProperties
初始化

ConcurrentKafkaListenerContainerFactoryConfigurer上是否存在公共访问限制问题,或者我是否有问题?

您可以从中构建
ConsumerFactory

@Bean
@ConditionalOnMissingBean(name="kafkaConsumerFactory")
public ConsumerFactory<String, String> kafkaConsumerFactory(KafkaProperties kafkaProperties) {
return new DefaultKafkaConsumerFactory<>(
        kafkaProperties.buildConsumerProperties(),
        new StringDeserializer(),
        new StringDeserializer());
}
@Bean
@ConditionalOnMissingBean(name=“kafkaConsumerFactory”)
公共消费工厂卡夫卡消费工厂(卡夫卡财产卡夫卡财产){
返回新的DefaultKafka消费者工厂(
kafkaProperties.buildConsumerProperties(),
新建StringDeserializer(),
新的StringDeserializer());
}
用于构建

@Bean
卡夫卡利斯特集装箱工厂
kafkaListenerContainerFactory(){
ConcurrentKafkalistener集装箱工厂=
新的ConcurrentKafkaListenerContainerFactory();
setConsumerFactory(kafkaConsumerFactory());
工厂设置并发(3);
factory.getContainerProperties().setPollTimeout(3000);
返回工厂;
}

我完全按照您显示的那样做,但令人厌恶的是我可以使用
file.kafka.consumer.*
配置ConsumerFactory,但我不能使用
file.kafka.listener.*
@Bean
KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Integer, String>>
                kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
                        new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(kafkaConsumerFactory());
factory.setConcurrency(3);
factory.getContainerProperties().setPollTimeout(3000);
return factory;
}