我一直在试验弹簧重试项目。我已经成功使用了它的@Retryable功能,但是我无法使用JDK动态代理来使用它。
我在测试中使用了以下代码段。
@Configuration
@EnableRetry
public class TestConfig {
@Bean
public MethodInterceptor retryInterceptor() {
return RetryInterceptorBuilder.stateful().maxAttempts(3).build();
}
}
@Service
public class RetryableServiceImpl implements RetryableService {
private int count = 0;
@Retryable(RuntimeException.class)
@Override
public void service() {
if (count++ < 2) {
throw new RuntimeException("Planned");
}
}
@Override
public int getCount() {
return count;
}
}
@ContextConfiguration(...)
public class RetryableServiceImplTest ... {
@Autowired
private RetryableService retryableService;
@Test
public void test() {
assertTrue(AopUtils.isAopProxy(retryableService));
assertTrue(AopUtils.isJdkDynamicProxy(retryableService));
assertFalse(AopUtils.isCglibProxy(retryableService));
retryableService.service();
assertEquals(3, retryableService.getCount());
}
}
此处提供示例项目: https://github.com/maddenj-ie/retry.git
所以,我的问题是
这应该使用cglib还是JDK动态代理?
如果是这样,我的设置出了什么问题?
感谢您的帮助。
问候,乔
答案 0 :(得分:3)
经过进一步调查后,回答我自己的问题:
它适用于两种代理机制。
必须将@Retryable注释应用于界面 该类的正确应用。
调试AnnotationAwareRetryOperationsInterceptor可以帮助我理解这一点。