Java에서 스케줄링을 할 때 Quartz를 많이 사용합니다. Quartz에서 사용하는 Trigger는 SimpleTrigger와 CronTrigger가 있는데요.
간단하게 특징을 보면 다음과 같습니다.
SimpleTrigger : 간단하며 interval, delay, repeat times 등을 설정할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <!-- 하나.주기적으로 실행될 클래스 설정 --> <!-- property name은 jobClass로 fix, value는 사용자가 작성한 class 파일 위치 --> <bean id="simpleQuartzJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="net.test.quartz.SimpleQuartzJob"/> </bean> <!-- 둘.스케줄러의 interval time 설정 --> <!-- 쿼츠에는 아래와 같이 몇초에 한번씩 돌게 하는 Simple type 과 --> <!-- 무슨 요일 몇시에 한번씩 돌게 하는 날짜로 지정하는 Cron type 이 있다. --> <!-- 현재는 Simple type으로 세팅 --> <!-- jobDetail은 위에서 설정한 실제 동작할 클래스 id를 적어준다 --> <!-- startDelay는 서버 시작후 몇초 뒤에 시작할지 세팅(ms 단위) --> <!-- repeatInterval은 몇 초에 한번씩 실행될 건지 세팅(ms 단위: 현재 1초) --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="simpleQuartzJob"/> <property name="startDelay" value="1000"/> <property name="repeatInterval" value="1000"/> </bean> <!--셋. 실제 동작하게끔 설정 --> <!--ref bean은 위에서 설정한 interval time 아이디를 넣어주면 됨 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger"/> </list> </property> <!-- Quartz 실행시 세팅 --> <property name="quartzProperties"> <props> <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> <prop key="org.quartz.threadPool.threadCount">5</prop> <prop key="org.quartz.threadPool.threadPriority">4</prop> <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop> <prop key="org.quartz.jobStore.misfireThreshold">60000</prop> </props> </property> </bean> </beans> | cs |
CronTrigger : Linux에서 사용하는 cron과 같은 표현(expression)을 사용하며, 특정 시간에 작동하도록 설정할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <!--하나. 주기적으로 실행될 클래스 설정 --> <bean id="cronQuartzJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="net.test.quartz.CronQuartzJob"/> </bean> <!--둘. 스케줄러의 interval time 설정--> <!--cronExpression을 통해서 스캐줄러 주기를 설정한다. --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="cronQuartzJob"/> <property name="cronExpression" value="0/1 * * * * ?"/> </bean> <!--셋. 실제 동작하게끔 설정 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> <property name="quartzProperties"> <props> <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> <prop key="org.quartz.threadPool.threadCount">5</prop> <prop key="org.quartz.threadPool.threadPriority">4</prop> <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop> <prop key="org.quartz.jobStore.misfireThreshold">60000</prop> </props> </property> </bean> </beans> | cs |
Field 설명
Cron expression은 공백(space)으로 구분된 6~7개의 문자(숫자, 영문자, 기호)를 포함합니다.
필드 명 |
필수 |
허용 값 |
Special characters |
초(seconds) |
Yes |
0-59 |
, - * / |
분(minutes) |
Yes |
0-59 |
, - * / |
시(hours) |
Yes |
0-23 |
, - * / |
날짜(day of month) |
Yes |
1-31 |
, - * / ? L W |
월(month) |
Yes |
1-12 or JAN-DEC |
, - * / |
요일(day of week) |
Yes |
1-7 or SUN-SAT |
, - * / ? L # |
년(year) |
No |
empty, 1979-2099 |
, - * / |
Special Characters 설명
* : 모든 값을 의미합니다. 만약 초에 사용하면 0초~59초까지를 의미합니다.
? : 특정 값을 정하지 않은 것입니다. 일과 요일에서 사용가능한데 일에 사용할 경우 어떤 요일도 상관 없는 것 입니다.
- : 범위를 의미합니다. 예를 들어 0-10이면 0부터 10까지입니다. 여기서 주의할 것은 마지막 값인 10이 포함된다는 것입니다.
, : 값을 추가할 때 사용합니다. 0-10,20-30은 0부터 10까지, 그리고 20부터 30까지를 의미합니다.
/ : 증분을 의미합니다. 예를 들어 초에 0/15를 사용하면 15초마다(0, 15, 30, 45) triggering합니다.
L : 마지막을 뜻합니다. 날짜에 사용하면 월의 마지막 날을 의미합니다. 31, 30 또는 28(윤달에는 29)일입니다.
W : 주중(weekday)를 의미합니다. 날짜와 같이 쓰면 그 날짜가 주중인 날을 의미합니다.
# : n번째를 의미합니다. 그 달의 몇번째 무슨 요일을 설정할 때 사용합니다. 예를 들어 3번째 월요일은 "2#3"으로 설정합니다.
Example
여기서 사용한 예는 Quartz 사이트의 CronTrigger Tutorial에서 차용했습니다.
Expression Meaning
0 0 12 * * ? 매일 12시(정오)
0 15 10 ? * * 매일 오전 10시 15분
0 15 10 * * ? 매일 오전 10시 15분
0 15 10 * * ? * 매일 오전 10시 15분
0 15 10 * * ? 2005 2005년에 매일 아침 10시 15분
0 * 14 * * ? 매일 오후 2시 0분 ~ 59분
0 0/5 14 * * ? 매일 오후 2시부터 2시 55분까지 5분마다
0 0/5 14,18 * * ? 매일 오후 2시부터 2시 55분까지 5분마다, 6시부터 6시 55분까지 5분마다
0 0-5 14 * * ? 매일 오후 2시부터 2시 5분까지 매분
0 10,44 14 ? 3 WED 매년 3월의 수요일마다 오후 2시 10분과 2시 44분
0 15 10 ? * MON-FRI 월요일부터 금요일까지 오전 10시 15분
0 15 10 15 * ? 매달 15일 오전 10시 15분
0 15 10 L * ? 매달 마지막 날 오전 10시 15분
0 15 10 ? * 6L 매달 마지막 금요일 오전 10시 15분
0 15 10 ? * 6L 2002-2005 2002년부터 2005년까지 매달 마지막 금요일 오전 10시 15분
0 15 10 ? * 6#3 매달 3번째 금요일 오전 10시 15분
0 0 12 1/5 * ? 매달 첫날부터 5일마다 12시(정오)
0 11 11 11 11 ? 매년 11월 11일 오전 11시 11분
참고
'Programing > JAVA' 카테고리의 다른 글
[java] Map을 로그에 출력하는 방법 (11) | 2022.02.11 |
---|---|
[ Java ] 로컬 ip 및 포트 확인방법 (0) | 2021.11.04 |
[ Java ] 소켓통신 예제 (1) | 2021.10.14 |
[ Java ] 파일생성 (0) | 2021.10.12 |
[ JAVA ] 서버 IP 가져오는 방법 (0) | 2021.03.05 |