在Spring重试中使用exceptionExpression

sgtfey8w  于 2022-12-17  发布在  Spring
关注(0)|答案(2)|浏览(159)

根据文档,我可以在exceptionExpression中使用类似下面的代码:@Retryable(exceptionExpression="message.contains('this can be retried')")
但是我想得到响应正文并检查其中的消息(来自RestClientResponseException),类似于以下内容:exceptionExpression = "getResponseBodyAsString().contains('important message')"
我试过了,但是没有用。那么,有没有可能做一些类似的事情,从responseBody检查信息呢?
编辑:按照加里Russell的建议添加整个@Retryable注解参数:
@Retryable(value = HttpClientErrorException.class, exceptionExpression = "#{#root instanceof T(org.springframework.web.client.HttpClientErrorException) AND responseBodyAsString.contains('important message')}")
我正在使用实际的RestClientResponseException子类,我正在捕获它,但仍然没有触发重试。

sy5wg1nm

sy5wg1nm1#

在当前版本中,表达式错误地要求静态模板标记;在1.3中将不需要它们。

@Retryable(exceptionExpression = "#{responseBodyAsString.contains('foo')}")

但是,如果存在includeexclude属性,则不能使用此表达式,因此表达式应检查类型:

@Retryable(exceptionExpression =
        "#{#root instanceof T(org.springframework.web.client.RestClientResponseException) "
        + "AND responseBodyAsString.contains('foo')}")

编辑

一个二个一个一个

hjzp0vay

hjzp0vay2#

我已经实现了以下方法,在我看来这要方便得多。

@Retryable(value = WebClientException.class,
        exceptionExpression = RetryCheckerService.EXPRESSION,
        maxAttempts = 5,
        backoff = @Backoff(delay = 500))
public List<ResultDto> getSomeResource () {}

这里RetryCheckerService封装了所有需要的逻辑。

@Service
public class RetryCheckerService {
    public static final String EXPRESSION = "@retryCheckerService.shouldRetry(#root)";

public boolean shouldRetry(WebClientException ex) {
    if (ex instanceof WebClientResponseException responseException) {
        return responseException.getStatusCode().is5xxServerError()
                || responseException.getStatusCode().equals(HttpStatus.NOT_FOUND);
    }

    if (ex instanceof WebClientRequestException requestException) {
        String message = requestException.getMessage();
        if (message == null) {
            return false;
        }
        return message.contains("HttpConnectionOverHTTP");
    }

    return false;
}
}

相关问题