@Retryable
REST テンプレートを呼び出すメソッドで使用しようとしています。通信エラーが原因でエラーが返された場合は、再試行したいのですが、それ以外の場合は、呼び出しで例外をスローしたいだけです。
ApiException が発生すると、@Retryable によってスローされて無視されるのではなく、十分な「回復可能」、つまりメソッドExhaustedRetryException
が見つからないという苦情が発生します。@Recover
回復可能なメソッドが存在するだけで満足し、期待どおりに機能するかどうかを確認したいと思いました。それほどでもない。例外をスローする代わりに、回復可能なメソッドを呼び出しました。
@Retryable(exclude = ApiException include = ConnectionException, maxAttempts = 5, backoff = @Backoff(multiplier = 2.5d, maxDelay = 1000000L, delay = 150000L))
Object call(String domainUri, ParameterizedTypeReference type, Optional<?> domain = Optional.empty(), HttpMethod httpMethod = HttpMethod.POST) throws RestClientException {
RequestEntity request = apiRequestFactory.createRequest(domainUri, domain, httpMethod)
log.info "************************** Request Entity **************************"
log.info "${request.toString()}"
ResponseEntity response
try {
response = restTemplate.exchange(request, type)
log.info "************************** Response Entity **************************"
log.info "${response.toString()}"
} catch (HttpStatusCodeException | HttpMessageNotWritableException httpException) {
String errorMessage
String exceptionClass = httpException.class.name.concat("-")
if(httpException instanceof HttpStatusCodeException) {
log.info "************************** API Error **************************"
log.error("API responded with errors: ${httpException.responseBodyAsString}")
ApiError apiError = buildErrorResponse(httpException.responseBodyAsString)
errorMessage = extractErrorMessage(apiError)
if(isHttpCommunicationError(httpException.getStatusCode().value())) {
throw new ConnectionException(exceptionClass.concat(errorMessage))
}
}
errorMessage = StringUtils.isBlank(errorMessage) ? exceptionClass.concat(httpException.message) : exceptionClass.concat(errorMessage)
throw new ApiException(httpMethod, domainUri, errorMessage)
}
if (type.type == ResponseEntity) {
response
}
else response.body
}
@Recover
Object connectionException(ConnectionException connEx) {
log.error("Retry failure - communicaiton error")
throw new ConnectionException(connEx.class.name + " - " + connEx.message)
}
任意の洞察をいただければ幸いです。バグですか、それともオペレーターのミスですか?これは Spring Boot 1.3.6 と Spring-Retry 1.1.3 を使用しています。