원본 본문으로 이동하기

Spring Job Scheduler

박용서 - 서론 스프링에 잡 스케줄링을 하는 방법에 대해서 설명해보겠습니다. 우선 용어정리와 크론 표현식에 대해서 알아보고 싶다면 아래 링크를 참고해주세요. 참고 : Job Scheduler 크론 (Cron) 과 크론 표현식 - https://gs.saro.me/#!m=elec&jn=866 스프링에서 잡 스케줄러 종류 스프링에서 사용할 수 있는 잡 스케줄러는 스프링 스케줄러와 쿼츠가 있습니다. 스프링 스케줄러 : https://spring.io/guides/gs/scheduling-tasks/ 쿼츠 스케줄러 : http://www.quartz-scheduler.org/ 둘에대한 특별한 장/단점을 찾지 못하여 편하게 쓸 수 있는 스프링 스케줄러로 설명을 하겠습니다. 스프링 스케줄러 예제 - @EnableScheduling 로 스케줄러를 사용한다고 선언합니다. @Configuration @EnableScheduling class SchedulingConfiguration { } - 잡을 만들어보겠습니다. @Component public class TSchedule { @Scheduled(cron="0/10 * * * * ?") public void execute() { System.out.println("10초마다 출력"); } } - 끝 - 나머지는 아래 크론 표현식을 읽어보시기 바랍니다. https://gs.saro.me/#!m=elec&jn=866 는.. 아니고요 및에 추가 설명이 있습니다.... (죄송합니다.) 실제 이용할때 몇가지 문제점 1. 잡(배치)를 직접 실행해야하는 경우. - 일반적으로 배치가 돌다가 오류가 났는데, 급하게 다시 돌려야하는 배치의 경우입니다. 다행이도 @Component 서비스 입니다. @Autowired TSchedule tSchedule; @RequestMapping("/admin/job/TSchedule") String tSchedule() { tSchedule.execute(); // ... 생략 } 바로 @Autowired 하여 동일하게 실행시킬 수 있습니다. 2. 개발하는 배치를 제외하고는 돌릴 수 없거나(환경부재) 돌리면 안되는 경우. 개발서버에선 해당 잡을 받아줄 연계장치가 없거나 쓸대없이 돌면 안되는 경우가 있습니다. (특히 로컬) 이런경우는 아래와 같이 처리할 수 있습니다. 2-1. 모든 잡 스케줄러 제거 (덮어쓰기) @Configuration @EnableScheduling class SchedulingConfiguration implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { if (로컬? 개발서버?) { // set 을통해 기존 설정을 모두 날려버렸습니다. taskRegistrar.setCronTasksList(Collections.emptyList()); } } } 그리고 직접 실행합니다. 다만 개발중에도 몇분에 한번씩 돌아야하는 경우가 있습니다. 2-2. 수동으로 추가하기 (덮어쓰기) - 물론 제대로 하려면 이 부분은 별도로 빼둬야할 것 같습니다. @Configuration @EnableScheduling class SchedulingConfiguration implements SchedulingConfigurer { @Autowired TSchedule tSchedule; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { if (로컬? 개발서버?) { // 리스트 생성 List<CronTask> list = new ArrayList<>(); // @Autowired tSchedule 를 직접 넣어주고 시간도 재설정 // 물론 리플렉션을 통해 시간을 가져올 수도있지만 보통 로컬에서 // 따로 돌릴 정도면 기존의 시간을 쓰지않는 경우가 대부분이라 // 이렇게 설정했습니다. list.add(new CronTask(() -> tSchedule.execute(), "0/5 * * * * ?")); // 모든 스케줄 덮어쓰기 taskRegistrar.setCronTasksList(list); } } } - 스프링 자바 스케줄/배치