결론적으로 만든 코드는 아래와 같습니다.
@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회 출력되는 것을 확인했습니다.