基于HttpStatus状态代码在spring中优化RetryPolicy重试?

基于HttpStatus状态代码在spring中优化RetryPolicy重试?,spring,spring-integration,spring-retry,Spring,Spring Integration,Spring Retry,是否可以根据错误状态代码在spring retry中设置RetryPolicy?e、 g.我不想使用HttpStatus.BAD_请求状态代码(400)重试HttpClientErrorException。因此,它应该忽略所有其他错误代码——4XX 我使用Spring集成http outboundGateway来调用服务器 现在,在我的RequestHandlerRetryAdvice中,我将我的重试建议配置为 SimpleRetryPolicy retryPolicy = new Simple

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

我使用Spring集成http outboundGateway来调用服务器

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

SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(4, Collections.singletonMap(HttpClientErrorException.class, false));
但这太普通了,我只是不想在400状态码上重试。对于每一个其他场景,我都希望重试我的模板。有人能给我一个解决方案吗


我仔细研究了堆栈溢出问题,找到了一个相关的答案,但我没有达到我的目的

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

public boolean canRetry(RetryContext context)
该方法委托给一个
二进制异常分类器
,以决定给定的异常是否可重试。该分类器根据异常类型做出决策:

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

您的定制将根据
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
以覆盖以下行为:

public boolean canRetry(RetryContext context)
该方法委托给一个
二进制异常分类器
,以决定给定的异常是否可重试。该分类器根据异常类型做出决策:

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

您的定制将根据
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=新的CustomRetryPolicy(4,Collections.singletonMap(HttpClientErrorException.class,false));是的,但我的问题是,只要您试图在
SimpleRetryPolicy
的实现中使用
RetryContext
,Spring将负责将其提供给您的策略,那么首先如何获取重试上下文。因此,有几个步骤:(1)创建自定义重试策略;(2) 将您的
RequestHandlerRetryAdvice
配置为使用您的自定义重试策略,一旦您证明您的策略正在被调用,则(3)调整它,直到它按照您希望的方式运行。好吧,那么我如何在通知中获取重试上下文呢?这里的想法是创建您自己的重试策略,即创建一个扩展
SimpleRetryPolicy
的类,覆盖
canRetry
方法,然后更新
RequestHandlerRetryAdvice
。。。SimpleRetryPolicy retryPolicy=新的CustomRetryPolicy(4,Collections.singletonMap(HttpClientErrorException.class,false));是的,但我的问题是,只要您试图在
SimpleRetryPolicy
的实现中使用
RetryContext
,Spring将负责将其提供给您的策略,那么首先如何获取重试上下文。因此,有几个步骤:(1)创建自定义重试策略;(2) 将您的
RequestHandlerRetryAdvice
配置为使用您的自定义重试策略,一旦您证明您的策略正在被调用,然后(3)调整它,直到它以您希望的方式运行。请参阅您复制的问题的答案。您肯定需要这里提到的
ExpressionRetryPolicy
。因此,看起来您的表达式必须类似于
statusCode.value()!=400
查看要复制的问题的答案。您肯定需要这里提到的
ExpressionRetryPolicy
。因此,看起来您的表达式必须类似于
statusCode.value()!=400