@Retryable是否适用于JDK Dynamic Proxies?

时间:2014-11-28 10:33:35

标签: spring-retry

我一直在试验弹簧重试项目。我已经成功使用了它的@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

所以,我的问题是

  1. 这应该使用cglib还是JDK动态代理?

  2. 如果是这样,我的设置出了什么问题?

  3. 感谢您的帮助。

    问候,乔

1 个答案:

答案 0 :(得分:3)

经过进一步调查后,回答我自己的问题:

  1. 它适用于两种代理机制。

  2. 必须将@Retryable注释应用于界面 该类的正确应用。

  3. 调试AnnotationAwareRetryOperationsInterceptor可以帮助我理解这一点。