我有一个使用Kafka活页夹的Spring Cloud Stream项目,我试图理解并最终定制Cloud Stream使用的RetryTemplate。
我没有找到很多有关其工作原理的文档,但是我所阅读的内容使我得出以下假设:
@StreamListener
中任何未捕获的异常都会触发Spring Retry这些假设正确吗?
现在,在我的应用程序中,我有一种模式,其中某些消息可以立即处理,但是其他消息必须推迟以备稍后再试(使用指数补偿等)。
我应该抛出一个异常,导致Spring Cloud Stream在绑定器层重试这些消息,还是自己实施重试并跟踪自己的重试上下文?
如果我应该依靠Cloud Stream的重试设置,那么应该如何自定义退避策略等?
default retry configuration尝试3次,初始延迟为1秒,乘数为2.0,最大延迟为10秒。
默认情况下,使用无状态重试,这意味着重试在内存中。
poll()
返回的所有记录的所有重试的总延迟不得超过max.poll.interval.ms
。
[使用适用于Apache Kafka的现代版Spring(由活页夹使用);最好禁用联编程序重试(maxAttempts=1
)并使用配置了适当SeekToCurrentErrorHandler
的BackOff
。
您可以通过ListenerContainerCustomizer<AbstractMessageListenerContainer<?, ?>>
和@Bean
一起设置错误处理程序。
这避免了上述问题,并且仅一条记录的最大延迟间隔必须小于return container -> container.setErrorHandler(handler)
。
您还可以分类哪些异常是可重试的,哪些不是可以重试的,以及配置在重试用尽后调用的死信恢复器。
请参见max.poll.interval.ms
。