Spring Kafka消费者KafkaListenerErrorHandler和ErrorHandler有什么区别?

4

我对KafkaListenerErrorHandler和ErrorHandler的角色和职责仍然感到困惑。以下是我目前对它们的理解,请纠正我如果我有误。

假设:使用Spring Kafka默认配置。

KafkaListenerErrorHandler

  • 当使用@KafkaListener注解的方法出现异常时,此处理程序将被调用。根据文档,这发生在监听器级别。

ErrorHandler

  • 当容器级别抛出异常时,此处理程序将被调用。处理错误后(通常只是记录一条日志),默认情况下会提交偏移量(因为isAckAfterHandle()默认返回true)。

我的疑惑

  • 既然我们已经在容器级别有ErrorHandler,为什么还需要单独的KafkaListenerErrorHandler?一个监听器属于一个容器,这两个处理程序的区别是什么?

  • 这是否意味着使用@KafkaListener注解时,容器级别的ErrorHandler永远不会处理错误,而是由监听器级别的KafkaListenerErrorHandler处理?

  • 如果使用@KafkaListener注解时,容器级别的ErrorHandler从未被调用,那么偏移量是如何提交的?KafkaListenerErrorHandler负责处理吗?KafkaListenerErrorHandler将重试失败的消息多少次?

  • KafkaListenerErrorHandler如何进行重试/恢复?

1个回答

1

KafkaListenerErrorHandler 主要用于请求/响应场景 - 它允许将某些错误指示作为结果发送给调用者,但同时返回某些值。

它也可以用于例如记录转换后的 Message<?> 并重新抛出异常,以便容器错误处理程序(现在默认为 SeekToCurrentErrorHandler)可以处理异常。容器错误处理程序无法访问已转换的消息。

如果监听器错误处理程序未重新抛出异常,则重试将被取消。

适配器中的重试已弃用,而采用容器错误处理程序,因为现在 SeekToCurrentErrorHandler 支持退避、异常分类等功能。


这是否意味着,如果 KafkaListenerErrorHandler 没有将异常抛回给容器,那么偏移量将被提交,并且主题中的下一条消息将由带有 @KafkaListener 注释的方法接收? - riceman
是的,那是正确的。 - Gary Russell
谢谢您的回答。我的一个后续问题是,当使用@KafkaListener注释的方法处理消息时出现错误时,Spring配置是否会通过KafkaListenerErrorHandler抛出异常?在我看来,它必须这样做,因为我肯定在日志中看到了重试,并且像您所说的那样,如果侦听器错误处理程序不抛出异常,则无法进行重试。 - riceman
默认情况下不存在侦听器错误处理程序,因此任何由侦听器引发的异常都会抛向容器。 - Gary Russell
这是否意味着为使用@KafkaListener注释的监听器提供一个错误处理程序监听器,我们必须配置KafkaListenerErrorHandler,因为默认情况下没有监听器错误处理程序? - riceman
是的,但正如我所说,它只适用于特定的用例。这不是必需的。 - Gary Russell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接