Различные попытки повтора для разных исключений в Spring @Retryable

В моем приложении SpringBoot у меня есть клиент, который может отправлять запрос POST. И во время POST может иметь несколько исключений.

Я хочу иметь логику повтора в случае двух разных исключений. Но таким образом, чтобы max-retry-attempts срабатывали для каждого исключения, а не вместе. Трудно объяснить, но пример:

Максимальное количество повторных попыток настроено на 3. Если я получаю тип exception1, чем повторная попытка, у меня остается 2 повторных попытки. Попробуйте еще раз и снова получите exception1, затем повторите попытку, и теперь у меня осталась 1 повторная попытка. Попробуйте еще раз, и теперь я получаю исключение2, затем попробуйте, и теперь у меня снова осталось 2 попытки, потому что предыдущие попытки были для исключения1, а не для исключения2. Таким образом, повторная попытка исключения 2 только что началась.

Является ли это возможным? Я пытался с этим, но это не начинается с повторных попыток для другого исключения, если произошло исключение1, а затем произошло исключение2, то у меня осталась 1 повторная попытка:

@Retryable(maxAttempts = 3, value = {Exception1.class, Exception2.class}, backoff = @Backoff(delay = 3000, multiplier = 2))

person victorio    schedule 24.10.2017    source источник


Ответы (2)


Вам нужно будет создать пользовательскую политику повторных попыток; и настройте его на RetryTemplate и RetryOperationsInterceptor; используйте свойство interceptor в аннотации для ссылки на перехватчик.

person Gary Russell    schedule 24.10.2017
comment
у вас есть пример для этого? потому что я не смог найти подходящего примера с разными исключениями, чтобы действовать так, как я описал. - person victorio; 24.10.2017
comment
Нет; как я уже сказал, вам нужно будет создать пользовательскую политику, чтобы добавить эту логику. - person Gary Russell; 24.10.2017

Я не думаю, что что-то существует для аннотации @Retryable. Если вы решите использовать реализацию RetryTemplate, вы можете использовать следующее, чтобы иметь разные попытки повтора для разных исключений и установить его в объект RetryTemplate:

final SimpleRetryPolicy simpleRetryPolicyTenTimes = new SimpleRetryPolicy();
simpleRetryPolicyTenTimes.setMaxAttempts(10);
final SimpleRetryPolicy simpleRetryPolicyTwoTimes = new SimpleRetryPolicy();
simpleRetryPolicyTwoTimes.setMaxAttempts(2);
final Map<Class<? extends Throwable>, RetryPolicy> policyMap = new HashMap<>();
policyMap.put(RetryException.class, simpleRetryPolicyTenTimes);
policyMap.put(HardFailException.class, simpleRetryPolicyTwoTimes);
final ExceptionClassifierRetryPolicy retryPolicy = new ExceptionClassifierRetryPolicy();
retryPolicy.setPolicyMap(policyMap);
return retryPolicy;

Вы можете найти пример здесь: https://www.programcreek.com/java-api-examples/index.php?api=org.springframework.retry.policy.ExceptionClassifierRetryPolicy

person Farid Jafri    schedule 12.12.2018