pom.xml에 아래와 같이 의존성을 추가하면 사용할수 있습니다.
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.0.3.RELEASE</version>
</dependency>
RetryTemplate 과 RetryOperationsInterceptor 를 제공합니다. RetryTemplate이라는 클래시에 재시도 횟수와 대기시간 정책 등을 지정할 수 있습니다.
- 설정파일 : simple-retry-config.xml
- 설정간편화를 위한 FactoryBean : SimpleRetryAdviceFactoryBean.java
- Recoverer : ProductRecoverer.java
- 테스트 코드 : RetryAndRecoverTest.java
spring-retry와 기능은 유사하나 API 사용성이 더 좋기 때문에 직접 interceptor를 작성할 때는 Spring의 RetryTemplate 대신 이 라이브러리를 사용해볼만도 합니다.
아래와 같이 의존성을 선언하면 사용할 수 있습니다.
<dependency>
<groupId>com.github.rholder</groupId>
<artifactId>guava-retrying</artifactId>
<version>1.0.6</version>
</dependency>
아래와 같이 Retry 횟수를 annotation의 속성으로 지정을 하는 경우,
@Retry(maxAttempt = 4)
public int update(Product product) {
Date now = new Date();
System.out.printf("update 시도 - %tT:%tL\n", now, now);
executeError();
return 1;
}
이를 지원하는 interceptor등의 예제는 아래에서 확인하실수 있습니다.
- AOP Interceptor : AnnotationBasedRetryInterceptor.java
- 설정 파일 : annotation-retry-config.xml
예제에서는 횟수만 지정했는데, 자주 쓰는 Retry정책을 Enum으로 만들어서 @Retry 애노테이션의 속성으로 지정을 하도록 만든 사례도 있습니다. 그리고 위와 같은 retry framework를 쓰지 않더라도 Interceptor안에서 try, catch, Thread.sleep(..) 문으로 같은 효과를 내는것도 어렵지는 않습니다.