복붙노트

[SPRING] HttpStatus 상태 코드를 기반으로 Spring 재시도에서 RetryPolicy를 설정할 수 있습니까?

SPRING

HttpStatus 상태 코드를 기반으로 Spring 재시도에서 RetryPolicy를 설정할 수 있습니까?

오류 상태 코드를 기반으로 봄 재 시도 (https://github.com/spring-projects/spring-retry)에서 RetryPolicy를 설정할 수 있습니까? 예 : 503 인 HttpStatus.INTERNAL_SERVER_ERROR 상태 코드로 HttpServerErrorException을 다시 시도하고 싶습니다. 따라서 다른 모든 오류 코드 - [500 - 502] 및 [504 - 511]은 무시해야합니다.

해결법

  1. ==============================

    1.RestTemplate에는 setErrorHandler 옵션이 있으며 DefaultResponseErrorHandler가 기본값입니다.

    RestTemplate에는 setErrorHandler 옵션이 있으며 DefaultResponseErrorHandler가 기본값입니다.

    코드는 다음과 같습니다.

    public void handleError(ClientHttpResponse response) throws IOException {
        HttpStatus statusCode = getHttpStatusCode(response);
        switch (statusCode.series()) {
            case CLIENT_ERROR:
                throw new HttpClientErrorException(statusCode, response.getStatusText(),
                        response.getHeaders(), getResponseBody(response), getCharset(response));
            case SERVER_ERROR:
                throw new HttpServerErrorException(statusCode, response.getStatusText(),
                        response.getHeaders(), getResponseBody(response), getCharset(response));
            default:
                throw new RestClientException("Unknown status code [" + statusCode + "]");
        }
    }
    

    따라서 해당 메소드에 대한 자체 구현을 제공하여 원하는 상태 코드를 중심으로 RetryPolicy를 단순화 할 수 있습니다.

  2. ==============================

    2.동일한 문제에 직면 한 다른 사람들을 위해이 답변을 게시하고 있습니다. 다음과 같이 사용자 정의 재시도 정책을 구현하십시오.

    동일한 문제에 직면 한 다른 사람들을 위해이 답변을 게시하고 있습니다. 다음과 같이 사용자 정의 재시도 정책을 구현하십시오.

    class InternalServerExceptionClassifierRetryPolicy extends ExceptionClassifierRetryPolicy {
    public InternalServerExceptionClassifierRetryPolicy() {
        final SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();
        simpleRetryPolicy.setMaxAttempts(3);
    
        this.setExceptionClassifier(new Classifier<Throwable, RetryPolicy>() {
            @Override
            public RetryPolicy classify(Throwable classifiable) {
                if (classifiable instanceof HttpServerErrorException) {
                    // For specifically 500 and 504
                    if (((HttpServerErrorException) classifiable).getStatusCode() == HttpStatus.INTERNAL_SERVER_ERROR
                            || ((HttpServerErrorException) classifiable)
                                    .getStatusCode() == HttpStatus.GATEWAY_TIMEOUT) {
                        return simpleRetryPolicy;
                    }
                    return new NeverRetryPolicy();
                }
                return new NeverRetryPolicy();
            }
        });
    }}
    

    Ans는 단순히 아래와 같이 호출합니다.

    RetryTemplate template = new RetryTemplate();
    template.setRetryPolicy(new InternalServerExceptionClassifierRetryPolicy())
    
  3. from https://stackoverflow.com/questions/27236216/is-it-possible-to-set-retrypolicy-in-spring-retry-based-on-httpstatus-status-cod by cc-by-sa and MIT license