Springboot @Retryable включает несколько исключений

Я поместил @Retryable в метод интерфейса, и теперь мне нужно включить более одного исключения, чтобы повторить попытку.

Код:

 @Retryable(interceptor = "someRetryInterceptor",
        include = { SomeException.class, SomeOtherException.class })

Это правильный способ сделать это?

Примечание. В someRetryInterceptor я определил RetryPolicy.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 991
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Согласно javadoc перехватчик является взаимоисключающим с другими атрибутами. Поэтому вы должны решить использовать либо перехватчик, либо включить.

Но чтобы быть уверенным: Просто протестируйте его! сделайте свой метод с аннотацией @Retryable, бросьте SomeException или SomeOtherException и посмотрите.

Один из способов проверить это: Предположим, вы пытаетесь повторно использовать метод

void dummy() {
 someObject.someOperation();
}

Имитируйте someObject (используя Mockito или любую другую библиотеку), чтобы someOperation выбрасывал SomeException/SomeOtherException. В тесте проверьте количество вызовов someObject.someOperation ()

Если у вас есть бесконечное количество повторных попыток (что редко бывает полезно), тогда тест зависнет, поэтому у такого теста должен быть тайм-аут (@Test(timeout=1000)), и вы должны пройти тест, когда произойдет TimeoutException.

Если у вас ограниченное количество попыток, вам следует проверить, сколько раз someObject.someOperation() был вызван до истечения времени ожидания.

Примечание: этот тест должен быть тестом Spring (должен загружать контекст с аннотацией @EnableRetry). В противном случае (если вы напишете его как простой модульный тест), аннотация @Retryable будет полностью проигнорирована.

Вся конфигурация должна выполняться на interceptor, если это указано; другие свойства аннотации игнорируются.

Gary Russell 11.04.2018 15:47

Нет; когда вы указываете interceptor, вся конфигурация должна выполняться там (включая исключения, обрабатываемые RetryPolicy).

См. Javadocs:

/**
 * Retry interceptor bean name to be applied for retryable method. Is mutually
 * exclusive with other attributes.
 * @return the retry interceptor bean name
 */
String interceptor() default "";

Другие вопросы по теме