Spring Boot Kafka在application.properties中设置ackOnError

时间:2019-07-16 15:47:08

标签: java spring spring-boot spring-kafka

是否有一种方法可以像其他侦听器属性一样使用spring boot application.properties文件来设置属性ackOnError = false:

spring.kafka.listener.ack-mode
spring.kafka.listener.ack-count
spring.kafka.listener.ack-time
spring.kafka.listener.poll-timeout

如果不可能的话,我该如何结合:文件+ Java配置中的属性?我不想像这样在java-config中设置所有kafka属性:

 @Bean
    public Map<String, Object> consumerConfigs() {
        Map<String, Object> props = new HashMap<>();
        ......
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
        return props;
    }

我只想覆盖ackOnError属性。 预先谢谢你。

1 个答案:

答案 0 :(得分:2)

它不能作为属性使用,但是您可以按如下所示覆盖Boot的容器工厂@Bean ...

@Bean
ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(
        ConcurrentKafkaListenerContainerFactoryConfigurer configurer,
        ConsumerFactory<Object, Object> kafkaConsumerFactory) {

    ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
    configurer.configure(factory, kafkaConsumerFactory);
    factory.getContainerProperties().setAckOnError(false);
    return factory;
}

这还将应用所有其他启动属性。

但是,除非您也停止容器(例如,使用ContainerStoppingErrorHandler),否则此设置没有太大用处。

这是因为无论如何,下一个成功的记录都将提交其偏移量,该偏移量超出了失败记录的偏移量。

也就是说,在2.3中,默认情况下为false