我不明白如何使用spring kafka将无法反序列化的消息写入DLT主题。
我根据spring kafka docs配置了使用者,这对于邮件反序列化之后发生的异常非常有用。
但是,如果无法对消息进行反序列化,则在轮询消息时会抛出org.apache.kafka.common.errors.SerializationException
。
随后,SeekToCurrentErrorHandler.handle(Exception thrownException, List<ConsumerRecord<?, ?>> records, ...)
被例外地调用,但记录列表为空,因此无法向DLT主题写入内容。
如何将这些消息也写到DLT主题上?
答案 0 :(得分:2)
问题是Kafka客户端本身抛出了异常,因此Spring无法查看失败的实际记录。
这就是为什么我们添加了ErrorHandlingDeserializer2
来包装实际的反序列化器的原因;故障将传递给侦听器容器,并以DeserializationException
重新抛出。
当反序列化器无法反序列化消息时,Spring无法处理该问题,因为它发生在poll()返回之前。为了解决此问题,版本2.2引入了ErrorHandlingDeserializer2。该解串器将委托给实际的解串器(键或值)。如果委托未能反序列化记录内容,则ErrorHandlingDeserializer2将在包含原因和原始字节的标头中返回空值和DeserializationException。当您使用记录级MessageListener时,如果ConsumerRecord包含键或值的DeserializationException标头,则会使用失败的ConsumerRecord调用容器的ErrorHandler。记录不会传递给侦听器。
DeadLetterPublishingRecoverer
具有检测异常并发布失败记录的逻辑。