Java 如何在使用SpringKafka框架时处理错误/异常?

Java 如何在使用SpringKafka框架时处理错误/异常?,java,error-handling,apache-kafka,spring-kafka,Java,Error Handling,Apache Kafka,Spring Kafka,我无法找到如何在中为spring kafka消费者执行自定义错误处理 我的要求是: 对于任何反序列化错误,只需将错误和消息写入数据库 对于@KafkaListener方法下的任何执行错误,请重试3次,然后将错误和消息写入数据库 从spring文档中我发现, 对于1,我必须使用ErrorHandlingDeserializer,然后它将调用@KafkaListener错误处理程序。 对于2,框架提供了处理消息重试的SeekToCurrentErrorHandler 我不明白除了启用配置的重试之外,

我无法找到如何在中为spring kafka消费者执行自定义错误处理

我的要求是:

  • 对于任何反序列化错误,只需将错误和消息写入数据库
  • 对于
    @KafkaListener
    方法下的任何执行错误,请重试3次,然后将错误和消息写入数据库
  • 从spring文档中我发现, 对于1,我必须使用
    ErrorHandlingDeserializer
    ,然后它将调用@KafkaListener错误处理程序。 对于2,框架提供了处理消息重试的
    SeekToCurrentErrorHandler


    我不明白除了启用配置的重试之外,在哪里可以添加将异常/消息写入数据库的代码。

    将恢复程序添加到
    SeekToCurrentErrorHandler

    new SeekToCurrentErrorHandler((rec, ex) -> {
        Throwable cause = ex.getCause();
        if (cause instanceof DeserializationException) {
            ...
        }
        else {
            ...
        }, new FixedBackOff(2000L, 2L));
    

    默认情况下,不会重试反序列化异常;大多数其他的在调用恢复程序之前都会重试。

    这里我没有得到反序列化异常,它被包装在ListenerExecutionFailedException中。我必须首先将异常强制转换为ListenerExecutionFailedException,然后检查它是否包含反序列化异常或其他类型;但你真的不必投下它;所有可丢弃的
    都有
    cause()