是否可以根据错误状态代码在弹簧重试中设置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?
答案 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
的自定义实施。