[SPRING] HttpStatus 상태 코드를 기반으로 Spring 재시도에서 RetryPolicy를 설정할 수 있습니까?
SPRINGHttpStatus 상태 코드를 기반으로 Spring 재시도에서 RetryPolicy를 설정할 수 있습니까?
오류 상태 코드를 기반으로 봄 재 시도 (https://github.com/spring-projects/spring-retry)에서 RetryPolicy를 설정할 수 있습니까? 예 : 503 인 HttpStatus.INTERNAL_SERVER_ERROR 상태 코드로 HttpServerErrorException을 다시 시도하고 싶습니다. 따라서 다른 모든 오류 코드 - [500 - 502] 및 [504 - 511]은 무시해야합니다.
해결법
-
==============================
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.동일한 문제에 직면 한 다른 사람들을 위해이 답변을 게시하고 있습니다. 다음과 같이 사용자 정의 재시도 정책을 구현하십시오.
동일한 문제에 직면 한 다른 사람들을 위해이 답변을 게시하고 있습니다. 다음과 같이 사용자 정의 재시도 정책을 구현하십시오.
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())
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
'SPRING' 카테고리의 다른 글
[SPRING] Spring MVC는 컨트롤러간에 같은 객체를 전달한다. (0) | 2019.02.14 |
---|---|
[SPRING] 스프링 데이터 JPA로 version 속성이 설정되지 않은 이유는 무엇입니까? (0) | 2019.02.14 |
[SPRING] 호출되지 않는 Spring 싱글 톤 Bean의 @PreDestroy 메소드 (0) | 2019.02.14 |
[SPRING] 봄 MVC 컨트롤러에서 컨텍스트 경로를 얻는 방법 (0) | 2019.02.14 |
[SPRING] 어떻게 자바에서 주석 실행 순서를 보장하기 위해? (0) | 2019.02.14 |