0

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

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

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

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

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

我经历了堆栈溢出问题,我找到了一个相关的答案,但我没有达到我的目的。是否可以根据 HttpStatus 状态码在 spring-retry 中设置 RetryPolicy?

4

1 回答 1

4

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

public boolean canRetry(RetryContext context)

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

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

您的自定义将根据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.

于 2017-10-11T11:09:23.310 回答