Q0. 개요
내가 해보았던 배치에는 두 가지 종류가 있다.
1. DB단에서 만들어주는 배치가 있고
2. 스프링에서 제공되는 스케줄러가 있다.
스프링에서 제공되는 @Scheduled 어노테이션을 이용하여 매월 말일 스케줄러를 작성하려고 한다.
//매월 말일 23시 59분
//@Scheduled(cron="0 59 23 last * *")
@Scheduled(cron="0 55 23 L * ?")
public void Solution() throws Exception {
log.info("Solution==> Start");
}
Q1. 여기서 Cron 표현식이란
task가 실행되는 시간/주기 등을 설정하는 Unix계열 운영체제의 작업 스케줄러라고 한다.
대부분의 크론식은 비슷하지만, 환경에 따라 조금씩 다르다.
아래는 스프링 스케줄러의 크론 표현식은 아래와 같다.
@Schduled(cron="0 55 23 L * ?")는 0초 55분 23시 말일.
그런대 톰캣 실행시 에러가 발생하게 된다.
11월 21, 2023 10:43:36 오전 org.apache.catalina.core.StandardContext loadOnStartup 심각: 웹 애플리케이션 [/daelimcorp] 내의 서블릿 [appServlet]이(가) load() 예외를 발생시켰습니다. java.lang.IllegalStateException: Encountered invalid @Scheduled method 'Solution': For input string: "L"
확인해보니까 말일을 표현하는 L 표현식은 환경에 따라 기능이 지원되지 않을 수 있다고 한다.
@Schduled에서는 기능이 지원되지 않는거로 보였다.
Q2. 결론적으로
매일 배치를 돌면서 비즈니스 로직에서 오늘 날짜가 말일인지를 체크하는 로직을 아래와 같이 추가하였다.
//매월 말일 23시 59분
@Scheduled(cron="0 55 23 * * ?")
public void Solution() throws Exception {
log.info("Solution==> Ready");
YearMonth currentYearMonth = YearMonth.now();
LocalDate lastDayOfMonth = currentYearMonth.atEndOfMonth();
LocalDate currentDate = LocalDate.now();
//이달 말일 체크
if (currentDate.equals(lastDayOfMonth)) {
HashMap<String, Object> map = new HashMap<String, Object>();
//오늘이 이달의 말일이라면 주요 업무 START
}
log.info("Solution ==> End");
}
'Error 모음' 카테고리의 다른 글
[Oracle] ORA-01745 호스트/바인드 변수명이 부적합합니다 (0) | 2023.11.21 |
---|---|
[Oracle] ORA-00911 문자가 부적합합니다 (0) | 2023.11.21 |
[Oracle] ORA-00001 무결성 제약 조건에 위배됩니다 (5) | 2023.11.21 |
[Java] java.net.MalformedURLException: no protocol (1) | 2023.11.21 |
[Spring] It's likely that neither a Result Type nor a Result Map was specified. (0) | 2023.11.20 |