使用@KafkaListener时以编程方式设置属性

时间:2019-02-01 00:55:24

标签: java spring-boot spring-kafka

我在我的Spring Boot应用程序中使用了@KafkaListener注释,而没有创建自定义的KafkaListenerContainerFactory bean。我目前正在我的application.yml文件中设置spring.kafka.consumer.value-deserializer属性,以分配我的解串器,并且更喜欢通过编程方式进行此操作以进行编译时检查。我意识到创建自己的KafkaListenerContainerFactory可以让我在工厂设置此属性,但是我想避免样板操作以及在进行SSL设置时的一些额外麻烦。

是否有一种简单的方法可以以编程方式设置我的值反序列化器,而无需创建自己的KafkaListenerContainerFactory

2 个答案:

答案 0 :(得分:2)

解串器具有用于创建使用者工厂而不是容器工厂的属性,您可以按以下方式覆盖引导程序的使用者工厂:

@Bean
public ConsumerFactory<?, ?> kafkaConsumerFactory(KafkaProperties properties) {
    Map<String, Object> props = properties.buildConsumerProperties();
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, MyDeserializer.class);
    return new DefaultKafkaConsumerFactory<>(props);
}

答案 1 :(得分:1)

根据docs

您可以设置其他属性,例如:

@KafkaListener(topics = "test-transactional",
               properties={"foo:bar","isolation.level:read_committed"})
public void listen(ConsumerRecord<?, ?> cr) throws Exception {
    logger.info("got consumer record" + cr.toString());
}


@KafkaListener(topics = "test-transactional",        
                         properties={"isolation.level:read_uncommitted"})
public void listenDifferent(ConsumerRecord<?, ?> cr) throws Exception {
    logger.info("uncomitted: got consumer record" + cr.toString());
}