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

码:

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


这是正确的方法吗?

注意:在someRetryInterceptor中,我定义了RetryPolicy。

最佳答案

根据javadoc,拦截器与其他属性互斥。
因此,您必须决定使用拦截器还是包含。

但要确保:只需对其进行单元测试!
 使带有@Retryable批注的方法抛出SomeExceptionSomeOtherException并查看它。

一种测试方法:
假设您正在重试方法

void dummy() {
 someObject.someOperation();
}


模拟someObject(使用Mockito或任何其他库),以便someOperation将抛出S omeException/SomeOtherException。在测试中,验证someObject.someOperation()的调用次数

如果您有无限次重试(很少有用),则测试将挂起,因此该测试必须具有超时(@Test(timeout=1000)),并且必须在发生TimeoutException时通过测试。

如果重试次数有限,则应验证超时前someObject.someOperation()被调用了多少次。

注意:该测试必须是Spring测试(必须加载带有@EnableRetry批注的上下文)。否则(如果将其编写为普通单元测试),则将完全忽略@Retryable注释。

07-24 20:11