Я поместил @Retryable в метод интерфейса, и теперь мне нужно включить более одного исключения, чтобы повторить попытку.
Код:
@Retryable(interceptor = "someRetryInterceptor",
include = { SomeException.class, SomeOtherException.class })
Это правильный способ сделать это?
Примечание. В someRetryInterceptor
я определил RetryPolicy.
Согласно 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
, вся конфигурация должна выполняться там (включая исключения, обрабатываемые 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 "";
Вся конфигурация должна выполняться на
interceptor
, если это указано; другие свойства аннотации игнорируются.