在Spring-retry中根据HttpStatus状态代码调整RetryPolicy?

时间:2017-10-11 10:31:34

标签: spring spring-integration spring-retry

是否可以根据错误状态代码在弹簧重试中设置RetryPolicy?例如我不想使用HttpStatus.BAD_REQUEST状态代码(即400)重试HttpClientErrorException。因此它应该忽略所有其他错误代码 - 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?

1 个答案:

答案 0 :(得分:2)

我认为您必须延长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的自定义实施。