Как обрабатывать несколько исключений, которые могут быть вызваны методом @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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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