【问题标题】:Call the retry listener from inside another listener maintaining with the whole retry Logic从另一个维护整个重试逻辑的侦听器内部调用重试侦听器
【发布时间】:2020-07-04 07:36:18
【问题描述】:

我们正在使用 spring-kafka-2.2.8.RELEASE。我有需要帮助的特殊情况。我有 4 个主题 topic、retryTopic、successTopic 和 errorTopic。 如果 topic 失败,应重定向到 retryTopic 3 次重试尝试的位置制成。如果这些尝试失败,则必须重定向到 errorTopic。如果 topicretryTopic 都成功,应重定向到 sucessTopic。这种情况已经基于问题How to retry with spring kafka version 2..2实现了。 但是现在,我遇到了一种新情况,我需要根据业务逻辑错误从 topic 侦听器内部调用 retryTopic 侦听器,而不会引发异常(它已经调用retryTopic 抛出异常并且它必须保持这种行为)。而且我还需要知道 retryTopic 在哪个重试尝试次数上被称为以下侦听器的参数。

 @KafkaListener(id = "so60172304.2", topics = "retryTopic")
 public void listen2(String in) {
            RetryTemplate retryTemplate = new RetryTemplate();
    retryTemplate.execute(new RetryCallback<Void, RuntimeException>() {
        @Override
        public Void doWithRetry(RetryContext retryContext) throws RuntimeException {
             // Can I get the retry count here? It didn't work
             Integer count =RetrySynchronizationManager.getContext().getRetryCount());
            return this.doWithRetry(retryContext);
        }
    }); 
  }

【问题讨论】:

    标签: spring-kafka spring-retry


    【解决方案1】:

    您没有理由不能从另一个侦听器调用一个侦听器(但除非您在第一种方法中使用 RetryTemplate 调用它,否则您不会重试)。

    如果您使用容器工厂上配置的RetryTemplate 进行重试(而不是在 2.3.x 及更高版本中将BackOff 添加到SeektoCurrentErrorHandler),您可以获得重试计数(从零)像这样......

    @KafkaListener(id = "so60172304.2", topics = "retryTopic")
    public void listen2(String in) {
        int retryCount = RetrySynchronizationManager.getContext().getRetryCount();
        ...
    }
    

    如果您直接从第一个方法调用它,getContext() 将返回 null(除非您将调用包装在 RetryTemplate.execute() 中)。

    在 2.5.x 中,即使使用 SeektoCurrentErrorHandlerBackOff 而不是在容器工厂中使用 RetryTemplate,也会(可选)提供传递尝试标头。

    【讨论】:

    • 我敦促您及时了解您的次要版本中的最新版本,即使您无法升级到更新的次要版本(当前最新版本是 2.4.4)。最新的 2.1.x 是 2.1.14 - 自您的版本 8 个月大以来的 6 个错误修复版本。
    • 我已经用一些代码编辑了我的问题,我可以像在 spring-kafka-2.2.8.RELEASE 中那样获得重试次数吗?
    • 那里不需要另一个重试模板;这将嵌套在主模板中。如果您从另一个调用此侦听器方法(并且您需要它),您只需要一个重试模板。请停止使用旧版本。
    • 使用旧版本不是我的决定。我已经告诉公司的建筑师改变原型,但他们不想这样做。你不需要对我大喊大叫。
    • 对不起;这非常令人沮丧;支持 4 个次要版本 2.4、2.3、2.2 和 1.3 已经够难了,而不必为每个版本回答有关古老点版本的问题。我花了很多时间添加功能和修复错误;我有时想知道我是不是在浪费时间。您的建筑师需要执行该计划。引导 2.1(以及因此 SK 2.2)进入 end of life in November
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2019-06-17
    • 2018-07-20
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多