Wrap key/value deserializers in Spring Kafka's ErrorHandlingDeserializer so a single poison record doesn't halt the consumer
Never set KafkaAvroDeserializer directly as the consumer's deserializer. Always wrap
with ErrorHandlingDeserializer so a bad record becomes a logged failure instead of
a stuck partition.
cfg.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer.class);
cfg.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ErrorHandlingDeserializer.class);
cfg.put(ErrorHandlingDeserializer.KEY_DESERIALIZER_CLASS, StringDeserializer.class);
cfg.put(ErrorHandlingDeserializer.VALUE_DESERIALIZER_CLASS, KafkaAvroDeserializer.class);
cfg.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, true);
DefaultErrorHandler + DLT (DeadLetterPublishingRecoverer) so poison records are
observable, not silently dropped.SeekToCurrentErrorHandler only for retryable errors — deserialization failures are
not retryable.