我已将 @Retryable 放在接口方法上,现在我需要包含多个异常才能重试。
代码:
@Retryable(interceptor = "someRetryInterceptor",
include = { SomeException.class, SomeOtherException.class })
这是一种正确的方法吗?
注意:在someRetryInterceptor
我已经定义了RetryPolicy。
答案 0 :(得分:3)
根据javadoc拦截器与其他属性互斥。 所以你必须决定使用interceptor或include。
但可以肯定:只需对其进行单元测试!
使用@Retryable
注释抛出SomeException
或SomeOtherException
来制作您的方法并查看。
测试它的方法之一: 假设您正在重试方法
void dummy() {
someObject.someOperation();
}
模拟someObject
(使用Mockito或任何其他库),以便someOperation
将抛出S omeException/SomeOtherException
。在测试中验证someObject.someOperation()
如果你有无限次重试(这很少有用),那么测试会挂起,所以这样的测试必须有超时(@Test(timeout=1000)
),你必须在TimeoutException
发生时进行测试。
如果您的重试次数有限,那么您应该验证在超时之前调用someObject.someOperation()
的次数。
注意:该测试必须是Spring测试(必须使用@EnableRetry
注释加载上下文)。否则(如果你把它写成普通的单元测试)那么@Retryable
注释将被完全忽略。
答案 1 :(得分:1)
没有;当您指定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 "";