특정 작업을 다시한번 시도해야 할때가 있다.
ex) API호출에 에러가 발생했을때
Retry : 특정 조건에 따라서 다시 반복하는것
Recover : Retry를 했음에도 안되는것들
<!-- spring - retry 사용을 위한 dependency -->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.13</version>
</dependency>
이렇게 추가를 해줬다면
springBootApplication 혹은 Configuration에 @EnableRetry를 붙여 기능을 활성화한다.
@EnableScheduling
@EnableRetry //여기
@SpringBootApplication
public class Application {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(Application.class, args);
}
@PostConstruct
public void started(){
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
}
}
그리고 이제 Retry하고 싶은 메소드에 아래와 같이 어노테이션을 붙여준다.
@Retryable(value = {ApiCallError.class},maxAttempts = 3, backoff= @Backoff(delay = 900000))
@Scheduled(cron="0 30 1 * * *", zone = "Asia/Seoul")
public void callAPi() throws InterruptedException, ApiCallError {}
안에 들어가는 값들에 대해 살펴보자면
value : {}안에 들어있는 예외 발생시 retry 실행
maxAttempts : 최대로 반복할 횟수 (default는 3)
backOff() : 몇초를 간격으로 retry를 할지
그럼 이제 Retry를 통해서 재시도를 만들었지만 이것조차안될때 실행하는 Recover를 만들자.
@Recover //1개면 생략 가능
public void recoverApi(ApiCallError error){
logger.error("API connection failed no more retry");
String emailMessage = "API connection failed please check your code";
ms.sendErrorMail(emailMessage);
}
//@Recover가 2개 이상있는데 recover를 안쓰면 맨아래에 잇는 메소드가 사용
@Recover
fun recoverMethod() {
...
}
@Recover
fun recoverMethod2() {
...
}
@Recover << 맨 마지막 거 실행
fun recoverMethod3() {
...
}
'SPRING' 카테고리의 다른 글
스프링의 xml의 역할 (1) | 2024.07.01 |
---|---|
ehcache (0) | 2024.05.30 |
db 이중화 작업(springBoot,mybatis) (0) | 2023.11.24 |
MVC 패턴 구현 순서 (1) | 2023.11.24 |
스프링 설정에 관하여(web.xml,servlet-context.xml,root-context.xml) (1) | 2023.11.24 |