web-dev-qa-db-ja.com

Springで破損した(シリアル化できない)メッセージをスキップする方法Kafkaコンシューマー?

この質問はSpringKafkaに関するもので、 Apache Kafka with High Level Consumer:Skip破損したメッセージ

読み取り/処理できない(破損している)レコードをスキップするようにSpring Kafkaコンシューマーを構成する方法はありますか?

デシリアライズできない場合、コンシューマーが同じレコードでスタックする状況が発生しています。これは、コンシューマーがスローするエラーです。

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of Java.time.LocalDate: no long/Long-argument constructor/factory method to deserialize from Number value 

コンシューマーはトピックをポーリングし、プログラムが強制終了されるまでループ内で同じエラーを出力し続けます。

次のコンシューマーファクトリ構成を持つ@KafkaListenerでは、

Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
4
Shankar P S

ErrorHandlingDeserializerが必要です: https://docs.spring.io/spring-kafka/docs/2.2.0.RELEASE/reference/html/_reference.html#error-handling-deserializer ==

そこに移動できない場合は2.2バージョン、独自の実装を検討し、適切に逆シリアル化できないレコードに対してnullを返します。

ソースコードは次のとおりです: https://github.com/spring-projects/spring-kafka/blob/master/spring-kafka/src/main/Java/org/springframework/kafka/support/serializer/ ErrorHandlingDeserializer2.Java

8
Artem Bilan