Springboot @Retryable包含多个异常

时间:2018-04-11 10:37:47

标签: java spring-boot spring-retry

我已将 @Retryable 放在接口方法上,现在我需要包含多个异常才能重试。

代码:

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

这是一种正确的方法吗?

注意:在someRetryInterceptor我已经定义了RetryPolicy。

2 个答案:

答案 0 :(得分:3)

根据javadoc拦截器与其他属性互斥。 所以你必须决定使用interceptor或include。

但可以肯定:只需对其进行单元测试!  使用@Retryable注释抛出SomeExceptionSomeOtherException来制作您的方法并查看。

测试它的方法之一: 假设您正在重试方法

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