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

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

Код:

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

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

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

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 "";

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