Как обрабатывать несколько исключений, которые могут быть вызваны методом @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: Cannot locate recovery method
В качестве обходного пути я могу обернуть исключение в другой класс с логической переменной, а затем вернуть его и выполнить оркестрацию. Но я хотел знать, есть ли более чистый способ сделать это.

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

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

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

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

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

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