Java Spring Kafka批处理错误处理程序-使用手动提交进行反序列化程序错误处理

Java Spring Kafka批处理错误处理程序-使用手动提交进行反序列化程序错误处理,java,spring-kafka,Java,Spring Kafka,我的服务在尝试处理JSON反序列化程序错误时陷入无限循环。我的服务使用手动即时确认模式,自动偏移重置为false。我正在主代码中使用acknowledge.acknowledge()提交批处理记录,但在批处理错误处理程序中,我无法提交无效消息的偏移量。我尝试了ConsumerAwareBatchErrorHandler和BatchErrorHandler,但isAckAfterHandle()方法或consumer.commitSync()不起作用 问题1:需要了解确认批处理/提交偏移量的流程。

我的服务在尝试处理JSON反序列化程序错误时陷入无限循环。我的服务使用手动即时确认模式,自动偏移重置为false。我正在主代码中使用
acknowledge.acknowledge()
提交批处理记录,但在批处理错误处理程序中,我无法提交无效消息的偏移量。我尝试了
ConsumerAwareBatchErrorHandler
BatchErrorHandler
,但
isAckAfterHandle()
方法或
consumer.commitSync()
不起作用

问题1:需要了解确认批处理/提交偏移量的流程。 问题2:我获取的数据为空。我试图从data(为null)或thrownexception中读取原始消息,但失败了

有人能帮我处理提交偏移量并转移到下一批吗?我希望在死信或错误队列中插入失败的消息,然后继续下一批消息

已尝试的代码:

@Bean
公共地图使用者配置(){
Map props=newhashmap();
put(ConsumerConfig.BOOTSTRAP\u server\u CONFIG,bootstrapserver);
put(ConsumerConfig.MAX\u POLL\u RECORDS\u CONFIG,maxPollRecords);
props.put(ConsumerConfig.MAX\u POLL\u INTERVAL\u MS\u CONFIG,maxPollIntervalMsConfig);
put(ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG,false);
props.put(ConsumerConfig.GROUP\u ID\u CONFIG,groupId);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,“最早”);
put(ConsumerConfig.KEY\u反序列化程序\u CLASS\u配置,ErrorHandlingDeserializer.CLASS);
props.put(ErrorHandlingDeserializer.KEY\u反序列化器\u类,StringDeserializer.CLASS);
put(ConsumerConfig.VALUE\u反序列化程序\u CLASS\u配置,ErrorHandlingDeserializer.CLASS);
put(ErrorHandlingDeserializer.VALUE\u反序列化器\u类,JsonDeserializer.CLASS);
返回道具;
}
@豆子
公共默认值KafkaconsumerFactory consumerFactory(){
返回新的DefaultKafkanConsumerFactory(consumerConfigs()、新的StringDeserializer()、新的JsonDeserializer(LocationRecordDto.class));
}
@比恩(卡夫卡音乐听众)
公共ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(){
ConcurrentKafkListenerContainerFactory=新ConcurrentKafkListenerContainerFactory();
setConsumerFactory(consumerFactory());
factory.setBatchListener(true);
factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL\u立即);
setBatchErrorHandler(新的ConsumerRawareBatchErrorHandler(){
@凌驾
公共无效句柄(异常thrownException、消费者记录数据、消费者){
if(thrownException实例of SerializationException){
字符串s=thrownException.getMessage().split(“反序列化分区的键/值时出错”)[1]。split(“.如果需要,请查找记录以继续使用”)[0];
字符串主题=s.split(“-”[0];
int offset=Integer.valueOf(s.split(“offset”)[1]);
int partition=Integer.valueOf(s.split(“-”[1])。split(“at”)[0]);
TopicPartition TopicPartition=新的TopicPartition(主题,分区);
consumer.seek(主题分区,偏移量+1);
}
//将数据推入错误队列的代码
//consumer.commitSync();
}
@凌驾
公共布尔值isAckAfterHandle(){
返回true;
}
});
返回工厂;
}

您必须处理侦听器中的反序列化异常,而不是错误处理程序,并正常提交批处理偏移量


或考虑使用新的.t/p>请将您的代码作为文本,而不是作为图像。完成了@加里·拉塞尔,如果可能的话,请帮助我