我不明白不能反序列化的消息是如何用spring写到DLT主题的。
我根据春季卡夫卡博士配置了使用者,这对于消息反序列化后出现的异常非常有效。
但是,当消息不可反序列化时,将在轮询消息时抛出org.apache.kafka.common.errors.SerializationException。
随后,使用此异常调用SeekToCurrentErrorHandler.handle(Exception thrownException, List<ConsumerRecord<?, ?>> records, ...),但使用一个空的记录列表,因此无法向DLT主题写入某些内容。
如何将这些消息也写入DLT主题?
发布于 2020-02-18 15:53:21
问题是,异常是由Kafka客户端本身抛出的,因此Spring无法看到失败的实际记录。
这就是为什么我们添加了可用于包装实际反序列化器的ErrorHandlingDeserializer2;故障将传递给侦听器容器,并作为DeserializationException重新抛出。
见文献资料。
当反序列化器无法反序列化消息时,Spring无法处理该问题,因为它发生在轮询()返回之前。为了解决这个问题,Version2.2引入了ErrorHandlingDeserializer2。此反序列化器委托给真正的反序列化器(键或值)。如果委托未能反序列化记录内容,则ErrorHandlingDeserializer2在包含原因和原始字节的标头中返回一个空值和一个DeserializationException。当使用记录级MessageListener时,如果ConsumerRecord包含键或值的DeserializationException头,则使用失败的ConsumerRecord调用容器的ErrorHandler。记录不会传递给侦听器。
DeadLetterPublishingRecoverer具有检测异常和发布失败记录的逻辑。
https://stackoverflow.com/questions/60284409
复制相似问题