发布无法反序列化到DLT主题的消息

时间:2020-02-18 15:32:54

标签: apache-kafka spring-kafka

我不明白如何使用spring kafka将无法反序列化的消息写入DLT主题。

我根据spring kafka docs配置了使用者,这对于邮件反序列化之后发生的异常非常有用。

但是,如果无法对消息进行反序列化,则在轮询消息时会抛出org.apache.kafka.common.errors.SerializationException

随后,SeekToCurrentErrorHandler.handle(Exception thrownException, List<ConsumerRecord<?, ?>> records, ...)被例外地调用,但记录列表为空,因此无法向DLT主题写入内容。

如何将这些消息也写到DLT主题上?

1 个答案:

答案 0 :(得分:2)

问题是Kafka客户端本身抛出了异常,因此Spring无法查看失败的实际记录。

这就是为什么我们添加了ErrorHandlingDeserializer2来包装实际的反序列化器的原因;故障将传递给侦听器容器,并以DeserializationException重新抛出。

请参见the documentation

当反序列化器无法反序列化消息时,Spring无法处理该问题,因为它发生在poll()返回之前。为了解决此问题,版本2.2引入了ErrorHandlingDeserializer2。该解串器将委托给实际的解串器(键或值)。如果委托未能反序列化记录内容,则ErrorHandlingDeserializer2将在包含原因和原始字节的标头中返回空值和DeserializationException。当您使用记录级MessageListener时,如果ConsumerRecord包含键或值的DeserializationException标头,则会使用失败的ConsumerRecord调用容器的ErrorHandler。记录不会传递给侦听器。

DeadLetterPublishingRecoverer具有检测异常并发布失败记录的逻辑。