스케쥴러를 실행해서 DB에 데이터를 넣을때 1분이면 될줄 알았는데 생각보다 오래 걸리고,,(10분)
새벽 3시에 스케쥴러가 실행되게 설정했지만 혹시나 그때 이용하는 사용자가 있을수도 있기 때문에! 사용자들이 사이트에 접속하면 서버 점검 페이지로 이동하는 기능을 구현해보았다.
처음에는 session에 값을 넣어서 스케쥴러 실행중일때와 아닐때를 구분할려고 했는데 스케쥴러가 실행되는 method는 파라미터를 받지 못해서 HttpSession
으로 session을 가져오기 실패.. 😥
그 다음날이 팀원들끼리 회의하는 날이였는데, 만나서 이런 문제가 있어서 어떻게 할지 모르겠다 라고 하니 한 팀원이 '전역변수 써' 한마디 툭 던졌다. 왜 전역변수 생각을 못해서 어제 하루종일 스케쥴러에서 parameter 받는법만 검색했는지 모르겠고.. 역시 집단지성이 최고라고 다시 한번 생각했다 (^///^)
그래서 구현한 코드!
onScheduled
변수를 선언하여 스케쥴러가 실행중일때와 아닐때를 구분한다.
Scheduler
//스케쥴러 실행중인지 확인할 전역변수 설정
public static boolean onScheduled = false;
// 매주 토요일 새벽 3시에 시작
@Scheduled(cron = "0 0 3 * * 6")
public void autoUpdate() throws Exception {
logger.info(new Date() + "스케쥴러 실행");
//스케쥴러 실행되면 true 변경
onScheduled = true;
int result = 0;
List<Map<String, String>> list = new ArrayList<>();
try {
// 학원 목록 읽어오기
createDocument(list);
for (Map<String, String> acadInfo : list) {
createDetailInfo(acadInfo);
result += academyMapper.createAcademy(acadInfo);
}
} catch (Exception e) {
e.printStackTrace();
}
logger.info("총 학원 갯수:" + result);
//스케쥴러 끝나면 false로 변경
onScheduled = false;
}
만약에 스케쥴러가 실행중일때 MainController에 요청이 들어오면 서버 점검 페이지로 이동!
Controller
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
AcadScheduler sche = new AcadScheduler();
//스케쥴러 실행중이면 서버 점검 페이지로 이동
if(sche.onScheduled == true) {
return "error/errorScheduled";
}else {
return "main";
}
}