【问题标题】:Tuning RetryPolicy in spring-retry based on HttpStatus status code? [duplicate]基于HttpStatus状态码在spring-retry中调整RetryPolicy? [复制]
【发布时间】:2017-10-11 10:31:34
【问题描述】:

是否可以根据错误状态码在spring retry中设置RetryPolicy?例如我不想用 HttpStatus.BAD_REQUEST 状态代码重试 HttpClientErrorException,它是 400。因此它应该忽略所有其他错误代码 - 4XX。

我正在使用 Spring Integration http outboundGateway 来调用服务器。

现在在我的 RequestHandlerRetryAdvice 中,我将我的重试建议配置为

SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(4, Collections.singletonMap(HttpClientErrorException.class, false));

但这太笼统了,我只是不想重试 400 状态代码。对于所有其他情况,我希望我的模板重试。有人可以在这里建议我一个解决方案吗?

我查看了堆栈溢出问题,找到了一个相关的答案,但没有达到我的目的。 Is it possible to set RetryPolicy in spring-retry based on HttpStatus status code?

【问题讨论】:

  • 查看您复制的问题的答案。你肯定需要那里提到的ExpressionRetryPolicy。所以,看起来你的表情一定是statusCode.value() != 400

标签: spring spring-integration spring-retry


【解决方案1】:

我认为您必须扩展 SimpleRetryPolicy 以覆盖以下行为:

public boolean canRetry(RetryContext context)

该方法委托给BinaryExceptionClassifier 来决定给定的异常是否可重试。该分类器根据异常类型做出决定:

根据对象与提供的类型的继承关系对对象进行分类。如果要分类的对象是提供的类型之一,或者是其中一种类型的子类,则返回非默认值

您的自定义将根据HttpClientErrorException.getStatusCode() 做出决定。这是它的粗略近似:

@Override
public boolean canRetry(RetryContext context) {
    Throwable t = context.getLastThrowable();
    if (HttpStatusCodeException.class.isAssignableFrom(t.getClass())) {
        HttpStatusCodeException httpStatusCodeException = (HttpStatusCodeException) t;
        if (httpStatusCodeException.getStatusCode() == HttpStatus.BAD_REQUEST) { 
            return false;   
        }
    }
    return super.canRetry(context);
}

更简洁的实现可能涉及org.springframework.classify.Classifier 的自定义实现。

【讨论】:

  • 好的,我如何在建议中获得重试上下文?
  • 这里的想法是创建您的 自己的 重试策略,即创建一个扩展 SimpleRetryPolicy 的类并覆盖 canRetry 方法,然后更新您的 RequestHandlerRetryAdvice .. . SimpleRetryPolicy retryPolicy = new CustomRetryPolicy(4, Collections.singletonMap(HttpClientErrorException.class, false));
  • 是的,但我的问题是我如何首先获得重试上下文
  • 只要您尝试在SimpleRetryPolicy 的实现中使用RetryContext,Spring 就会将其提供给您的策略。所以,几个步骤:(1)创建您的自定义重试策略; (2) 配置您的 RequestHandlerRetryAdvice 以使用您的自定义重试策略,一旦您证明您的策略正在被调用,然后 (3) 调整它,直到它的行为方式符合您的要求。
猜你喜欢
  • 2015-01-29
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多