Java Spring Kafka消费者如何从Avro反序列化程序异常中跳过

Java Spring Kafka消费者如何从Avro反序列化程序异常中跳过,java,spring,apache-kafka,spring-kafka,Java,Spring,Apache Kafka,Spring Kafka,我正在使用SpringKafka消费者和Avro模式构建我的应用程序 但是,如果消息无法反序列化到我生成的指定Avro特定记录,使用者将不断地反复尝试相同的消息(无限重试) 对于这种情况,如果我的使用者出现反序列化程序异常,如何配置使用者应用程序以跳过当前消息并移动到下一个偏移量 我已经研究了SpringKafka错误句柄,它只能处理侦听器中的异常,而不是在反序列化阶段 我的消费者应用程序非常简单: @KafkaListener(id = "demo-consumer-stream-group"

我正在使用SpringKafka消费者和Avro模式构建我的应用程序

但是,如果消息无法反序列化到我生成的指定Avro特定记录,使用者将不断地反复尝试相同的消息(无限重试)

对于这种情况,如果我的使用者出现反序列化程序异常,如何配置使用者应用程序以跳过当前消息并移动到下一个偏移量

我已经研究了SpringKafka错误句柄,它只能处理侦听器中的异常,而不是在反序列化阶段

我的消费者应用程序非常简单:

@KafkaListener(id = "demo-consumer-stream-group", topics = "customer-output-")
  public void process(ConsumerRecord<String, Customer> record) {
    LOGGER.info("Customer key: {} and value: {}", record.key(), record.value());
    LOGGER.info("topic: {}, partition: {}, offset: {}", record.topic(), record.partition(), record.offset());
  }
是的

您可以通过自定义Spring属性将反序列化器设置为错误处理反序列化器及其委托

您可以使用DefaultKafkaConsumerFactory构造函数,该构造函数接受键和值反序列化器对象,并连接到已配置了适当委托的相应ErrorHandlingDeserializer2实例中。或者,您可以使用使用者配置属性(ErrorHandlingDeserializer使用这些属性)来实例化委托。属性名称为ErrorHandlingDeserializer2.KEY_DESERIALIZER_类和ErrorHandlingDeserializer2.VALUE_DESERIALIZER_类。属性值可以是类或类名。以下示例显示了如何设置这些属性:

..//其他道具
put(ConsumerConfig.VALUE\u反序列化程序\u CLASS\u配置,ErrorHandlingDeserializer2.CLASS);
put(ConsumerConfig.KEY\u反序列化程序\u CLASS\u配置,ErrorHandlingDeserializer2.CLASS);
put(ErrorHandlingDeserializer.KEY_反序列化器_类,JsonDeserializer.CLASS);
put(JsonDeserializer.KEY_默认_类型,“com.example.MyKey”)
put(ErrorHandlingDeserializer.VALUE_DESERIALIZER_类,JsonDeserializer.CLASS.getName());
put(JsonDeserializer.VALUE\u默认类型,“com.example.MyValue”)
put(JsonDeserializer.TRUSTED_包,“com.example”)
返回新的默认卡夫卡消费工厂(道具);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KafkaAvroDeserializer.class);
... // other props
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer2.class);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer2.class);
props.put(ErrorHandlingDeserializer.KEY_DESERIALIZER_CLASS, JsonDeserializer.class);
props.put(JsonDeserializer.KEY_DEFAULT_TYPE, "com.example.MyKey")
props.put(ErrorHandlingDeserializer.VALUE_DESERIALIZER_CLASS, JsonDeserializer.class.getName());
props.put(JsonDeserializer.VALUE_DEFAULT_TYPE, "com.example.MyValue")
props.put(JsonDeserializer.TRUSTED_PACKAGES, "com.example")
return new DefaultKafkaConsumerFactory<>(props);