본문 바로가기
SPRING

Retry 와 Recover

by brilliant-growth 2024. 5. 30.

특정 작업을 다시한번 시도해야 할때가 있다.

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