Spring Kafka 2.7.8版本setAckOnError方法废弃后等效配置方案问询
Spring Kafka 2.7.8 版本setAckOnError(false)废弃替代方案
Spring Kafka从2.3版本开始标记setAckOnError()方法为废弃,2.7版本正式移除该方法,官方调整了错误场景下的offset提交逻辑,用统一的配置项和容器属性替代了原有的方法调用,你可以通过以下两种方式实现错误场景下不自动确认的效果:
方案1:配置文件直接设置(入门首选,无需修改业务代码)
如果你的项目使用Spring Boot自动装配Kafka配置,直接在application.yml或者application.properties中添加对应配置即可,效果和原setAckOnError(false)完全一致:
- application.yml配置示例:
spring: kafka: listener: # 错误场景下不自动提交offset ack-on-error: false # 可保留你原来的ack-mode配置,手动模式MANUAL/MANUAL_IMMEDIATE、自动模式RECORD/BATCH都兼容 ack-mode: MANUAL_IMMEDIATE
- application.properties配置示例:
spring.kafka.listener.ack-on-error=false
方案2:自定义容器工厂时设置
如果你是自行定义ConcurrentKafkaListenerContainerFactory实例,直接通过容器属性设置即可,代码示例如下:
@Bean public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory( ConcurrentKafkaListenerContainerFactoryConfigurer configurer, ConsumerFactory<String, String> consumerFactory) { ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); configurer.configure(factory, consumerFactory); // 核心配置,等价于原setAckOnError(false) factory.getContainerProperties().setAckOnError(false); return factory; }
入门用户注意事项
- 开启错误不自动确认后,消费失败的消息offset不会提交,默认会按照你配置的重试规则重复消费,如果没有配置重试和死信队列,会出现单条错误消息阻塞整个消费队列的情况,建议搭配重试次数限制+死信队列使用。
- 如果你使用的是手动ack模式,异常场景下只要不调用
Acknowledgment.acknowledge()方法,也可以实现不自动确认的效果,和上述配置不冲突。
内容的提问来源于stack exchange,提问作者Tanaya Mitra
相关产品推荐
相关产品推荐

