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

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

Код:

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

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

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


person USM    schedule 11.04.2018    source источник


Ответы (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 будет полностью проигнорирована.

person Bartosz Bilicki    schedule 11.04.2018
comment
Вся конфигурация должна быть выполнена на interceptor, если она указана; другие свойства аннотации игнорируются. - person Gary Russell; 11.04.2018

Нет; когда вы указываете 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 "";
person Gary Russell    schedule 11.04.2018