Как обрабатывать несколько исключений, которые могут быть вызваны методом @Retryable веснойJAVA

Программисты JAVA общаются здесь
Anonymous
Как обрабатывать несколько исключений, которые могут быть вызваны методом @Retryable весной

Сообщение Anonymous »

У меня есть простой класс службы, который вызывает сторонний API для создания или обновления записи. В моем классе обслуживания есть два отдельных метода для выполнения вызовов POST и PUT. Класс обслуживания сначала выполняет вызов POST, и если API выдает исключение, сообщающее, что свойство уже существует, выполняется вызов PUT. Другого способа узнать заранее нет, и поэтому приходится полагаться на исключение из API. Ниже приведены методы (повторные попытки работают нормально, поэтому конфигурации повторных попыток не учитываются)

Код: Выделить всё

@Retryable(retryFor = {TechnicalException.class})
public void createPropertyWithRetry(CustomData customData)
throws TechnicalException {
try {
List response =
clientApi.createCustomData(customData);

} catch (ApiException e) {
if (isTechnicalError(e)) {
throw new TechnicalException("Technical error");
}
}
}

@Retryable(retryFor = {TechnicalException.class})
public void updatePropertyWithRetry(CustomData customData)
throws TechnicalException {
try {
List response =
clientApi.updateCustomData(customData);

} catch (ApiException e) {
if (isTechnicalError(e)) {
throw new TechnicalException("Technical error");
}
}
}
Ниже описан мой метод восстановления

Код: Выделить всё

@Recover
public void recoverFromTechnicalFailure(
TechnicalException ex,
CustomDataApi customDataApi,
CustomDataDetail customDataDetail,
String propertyCode) {
logErrorMessage(
log,
"Operation failed after {} retries for property {}",
maxRetryAttempts,
propertyCode,
ex);

metricsService.incrementRetriesExhausted();
throw new TechnicalException(
"Failed to process property " + propertyCode + " after all retries", ex);
}
Повторные попытки должны выполняться только для технических исключений.
Часть метода оркестратора, которая вызывает вышеуказанные методы

Код: Выделить всё

void makeApiCall(){
try {
apiService.createPropertyWithRetry(customDataApi);
} catch (ApiException apiException) {
if (doesPropertyExist(apiException)) { // checks and
apiService.updatePropertyWithRetry(customDataApi);
} else {
// handling / re-throwing other exceptions
}
}
}
Проблема в следующем:
Как правильно выбросить ApiException из моего повторяемого метода?
Поскольку он повторяет попытку только для технического исключения, если я выбрасываю ApiException из этих методов, приложение выдает исключение ниже:

org.springframework.retry.ExhaustedRetryException: невозможно найти
метод восстановления

В качестве обходного пути я могу обернуть исключение в другой класс с логической переменной, а затем вернуть его и выполнить оркестровку. Но я хотел знать, есть ли более чистый способ сделать это.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -method-in

Вернуться в «JAVA»