Я пытаюсь использовать @Retryable
по методу, который вызывает шаблон REST. Если ошибка возникает из-за ошибки связи, я хочу повторить попытку, иначе я хочу просто вызвать исключение в вызове.Попытка исключить исключение с помощью @Retryable - вызывает выброс ExhaustedRetryException
Когда возникает 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.
Можете ли вы уточнить, что это неправильно с синтаксисом? Я ничего не получаю при компиляции. Я попробую добавить пустой метод @Recover. – Les
Итак, я включил метод @Recover для всех, и исключение, которое оно получает, - это тот, который я сказал, чтобы исключить. – Les
Правильно. Если у вас есть хотя бы один метод '@ Recover', вам нужно всего лишь выделить исключения для исключенных (не повторенных) исключений; он может воссоздать, как у меня). Re синтаксис: сравните ваш: 'exclude = ApiException include = ConnectionException,' my mine: 'include = IllegalArgumentException.class, exclude = IllegalStateException.class,' - требуется запятая и '.class'. –