[Springboot] 비동기로 일정 시간 후 메서드 1회 실행시키기

이재훈·2023년 9월 13일
0

삽질모음집

목록 보기
4/8

현재 업무는 아래와 같습니다.

  1. 자바 코드로 우분투 네트워크 인터페이스 수정 (file 수정)
  2. 서버 reboot
  3. 서버 실행 시 자동으로 spring boot 프로젝트 실행
  4. spring boot 실행 후 웹 접속하여 정책 확인 버튼을 누르지 않으면 5분후 자동
    백업되어 있던 인터페이스 설정 파일 되돌리기 & 서버 reboot

결론적으로 만든 코드는 아래와 같습니다.

@Slf4j
@RequiredArgsConstructor
@Component
public class ScheduleService {
	
    // ... 생략
    
    @PostConstruct
    public void checkRollbackStatus() {
        ScheduledExecutorService excutorService = Executors.newScheduledThreadPool(1);
        excutorService.schedule(() -> {
        	
            // ... 로직 생략
            
            log.info("메서드 수행 확인");
            excutorService.shutdown();
        }, 5, TimeUnit.MINUTES);
    }
}

@Component를 사용하여 스프링 빈 등록을 하고 @PostConstruct로 의존성 주입이 일어난 후에 자동으로 수행되게 됩니다.

메서드 안에서는 새로운 ThreadPool을 생성합니다.

ScheduledExecutorService excutorService = Executors.newScheduledThreadPool(1);

생성한 ThreadPool을 사용하여 5분 후 수행되는 스케줄링을 만듭니다.

excutorService.schedule(() -> {

	// ... 로직 생략

	log.info("메서드 수행 확인");
	excutorService.shutdown();
}, 5, TimeUnit.MINUTES);

로직이 수행된 후 쓰레드를 shotdown 하여 리소스를 낭비하지 않게 합니다.

excutorService.shutdown();

5분 후에 해당 로직이 1번 수행되게 하였고, 아래 부분을 수정하면 다른 시간에도 수행되게 설정할 수 있습니다.

5, TimeUnit.MINUTES

짧은 로직이지만 꽤나 많은 시간을 고민하여 작성한 코드입니다. 스케줄링을 걸어서 5분마다 체크할까 했지만, 정책적으로의 문제나, 리소스 낭비 때문에 새로운 Thread를 만들어서 비동기로 처리하는 로직을 만들어 보았습니다. 이제 잘 수행되는지 테스트를 해보겠습니다.

메서드가 원하는 시간에 1회 출력되는 것을 확인했습니다.

profile
부족함을 인정하고 노력하자

0개의 댓글