๐Ÿ“• Language/Java

[Java] xml์„ ์ด์šฉํ•œ Quartz Job Scheduler ์„ค์ •

a n u e 2022. 2. 9. 09:57
๋ชฉ์ฐจ
์ฟผ์ธ ๋ž€?
์ฟผ์ธ  ์‹คํ–‰ ํ๋ฆ„
์ฟผ์ธ  ๊ตฌ์„ฑ์š”์†Œ
์ฟผ์ธ  ๊ตฌํ˜„ ๋ฐฉ๋ฒ• - XML์„ ์ด์šฉํ•œ Quartz Scheduler๊ตฌํ˜„
cron Expression

์ฟผ์ธ (Quartz)๋ž€?

Job scheduling Library. ํŠน์ • ์‹œ๊ฐ„, ๋˜๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ ๋˜์–ด์•ผํ•˜๋Š” ๋ฐฐ์น˜์„ฑ ์ž‘์—… ์ƒ์„ฑ ์‹œ ์‚ฌ์šฉํ•œ๋‹ค. ๋‚˜๋Š” ํ˜„์—…์—์„œ ์ฃผ๋กœ  ํ”„๋กœ๊ทธ๋žจ๊ณผ์˜ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ํ•˜๊ฑฐ๋‚˜, ์ง€ํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋งค์ผ ์ƒˆ๋ฒฝ ํŠน์ •ํ•œ ์‹œ๊ฐ„๋Œ€๋งˆ๋‹ค ํŠน์ • ์„œ๋น„์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‹์ด๋‹ค. 

 ์ฟผ์ธ ์˜ ๋Œ€ํ‘œ์ ์ธ ์žฅ์ ์€ ์ผ๋ จ์˜ ์ž‘์—…๋“ค์˜ ์‹คํ–‰ ์‹œ๊ฐ„๋Œ€๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ํŠน์ •ํ•œ ๋‚ , ํŠน์ •ํ•œ ์‹œ๊ฐ„ ๋ฟ ์•„๋‹ˆ๋ผ ์š”์ผ ๋ฐ ์‹œ๊ฐ„์˜ ๊ฐ„๊ฒฉ๊นŒ์ง€๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 


์ฟผ์ธ  ์‹คํ–‰ ํ๋ฆ„

 

์ฟผ์ธ ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•ด๋ณธ ๊ทธ๋ฆผ์ด๋‹ค.

Scheduler๊ฐ€ Job์— ์ ํ˜€์ง„ ์‹คํ–‰์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ •ํ•ด์ง„ ์‹œ๊ฐ„์ด๋‚˜ ์ฃผ๊ธฐ์— Job์„ ์‹คํ–‰ํ•œ๋‹ค.


์ฟผ์ธ  ๊ตฌ์„ฑ ์š”์†Œ

1. Scheduler Factory

 - Scheduler ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋‹ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค. ์‚ฌ์šฉ๋˜๋Š” Trigger๋ฅผ ๋“ฑ๋ก์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋ฏ€๋กœ Trigger๋“ค์„ triggers ์†์„ฑ์˜ <list> ํƒœ๊ทธ ํ•˜์œ„๋กœ ๋“ฑ๋ก์‹œํ‚จ๋‹ค. 

 

2. Scheduler 

 - Scheduler Factory์— ์˜ํ•ด ์ƒ์„ฑ๋œ๋‹ค. Quartz ์Šค์ผ€์ฅด๋Ÿฌ์˜ ๋ฉ”์ธ ์ธํ„ฐํŽ˜์ด์Šค. ์Šค์ผ€์ค„๋Ÿฌ๋Š” JobDetail๊ณผ Trigger๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ, ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

3. Job

 - Scheduler์— ์˜ํ•ด ์ˆ˜ํ–‰๋  ์‹ค์ œ ์ž‘์—…์ด ๊ตฌํ˜„๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด. ์ฆ‰, ์‹คํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํƒ€ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™์„ ํ†ตํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ฑฐ๋‚˜, ์ž๋™ ๋ฉ”์ผ๋ง ์ „์†ก ๊ธฐ๋Šฅ ๊ฐ™์€ ๋ฐฐ์น˜์„ฑ ์ž‘์—…์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๊ฐ€ ์ด์— ํ•ด๋‹นํ•œ๋‹ค. ๊ฐ™์€ ๊ทธ๋ฃน์—๋Š” ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ job์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

 

4. Trigger

 - Job ์ˆ˜ํ–‰์„ ์œ„ํ•œ ์กฐ๊ฑด์„ ์ •์˜ํ•œ ๊ฐ์ฒด๋กœ, ํŠน์ • ์‹œ๊ฐ„์ด๋‚˜ ํšŸ์ˆ˜, ๋ฐ˜๋ณต ์ฃผ๊ธฐ๋ฅผ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์Šคํ”„๋ง์—์„œ๋Š” ์ฟผ์ธ ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก 2๊ฐœ์˜ TriggerBean์„ ์ œ๊ณตํ•œ๋‹ค. SimpleTrigger, CronTrigger๋Š” ๋‘˜ ๋‹ค ํŠธ๋ฆฌ๊ฑฐ๋ผ๋Š” ์ ์—์„œ๋Š” ๋™์ผํ•˜๋‹ค. ํ•˜์ง€๋งŒ, ์‹คํ–‰์กฐ๊ฑด์—์„œ ์ฐจ์ด์ ์„ ๋ณด์ธ๋‹ค. CronTriggerBean์€ cron ํ‘œํ˜„์„ ์ด์šฉํ•˜์—ฌ ์ž‘์„ฑํ•˜๋Š”๋ฐ, ๋ฆฌ๋ˆ…์Šค์—์„œ๋„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•œ๋‹ค. (๋ฆฌ๋ˆ…์Šค ํฌ๋ก ํƒญ ์ฐธ๊ณ )

 

<!-- crontrigger ๋ฐฉ์‹ -->
<bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail"><ref bean="quartzTestServiceMethod" /></property>
    <!-- ๋งค 10๋ถ„๋งˆ๋‹ค ์‹คํ–‰ํ•œ๋‹ค -->
    <property name="cronExpression"><value>0 0,10,20,30,40,50 * * * ?</value></property>
</bean>

<!-- simpleTrigger ๋ฐฉ์‹ -->
<bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
    <property name="jobDetail" ref="quartzTestServiceMethod" />
    <!-- ์‹œ์ž‘ํ•˜๊ณ  1๋ถ„ํ›„์— ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ • 
    ์„œ๋ฒ„ ๊ฐ€๋™ ํ›„, ์‹œ์ž‘ํ•  ์‹œ๊ฐ„์„ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ์œ„๋Š” millisecond์ด๋‹ค. -->
    <property name="startDelay" value="60000" />
    <!-- ๋งค 24์‹œ๊ฐ„๋งˆ๋‹ค ์‹คํ–‰ํ•œ๋‹ค. ๋ฐ˜๋ณต ์‹œ๊ฐ„ ์„ค์ •. ๋‹จ์œ„๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ millisecond -->
    <property name="repeatInterval" value="864000000" />
</bean>

 

SimpleTrigger : ํŠน์ • ์‹œ๊ฐ„๋Œ€ ๋ฐ ํšŸ์ˆ˜ ์ •์˜
CronTrigger : ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ˜๋ณต. ์ข€ ๋” ์„ธ๋ถ€์ ์ธ ์ผ์ •์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Trigger์™€ Job์˜ ๊ด€๊ณ„?
    • 1 Trigger = 1 Job: ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ Trigger๋Š” ํ•˜๋‚˜์˜ Job์„ ์ง€์ •
    • N Trigger = 1 Job: ํ•˜๋‚˜์˜ Job์„ ์—ฌ๋Ÿฌ ์‹œ๊ฐ„์—์„œ ์‹คํ–‰

 

5. Listenr

- ์กฐ๊ธˆ ์ดํ•ด๊ฐ€ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„. ์ฟผ์ธ  ๋ฆฌ์Šค๋„ˆ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ๋ถ€ํ„ฐ ์ฝœ๋ฐฑ์„ ๋ฐ›๋Š” ์ž๋ฐ” ํด๋ž˜์Šค๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•  ๊ฒƒ ๊ฐ™๋‹ค. 

์ฟผ์ธ  ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ด๋ ‡๋“ฏ Scheduler, Job, Trigger๋ฅผ ์œ„ํ•œ Listener๋ฅผ ์ œ๊ณตํ•œ๋‹ค. JobListenr๋Š” Job ์‹คํ–‰ ์ด์ „, ์ดํ›„๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , TriggerLIstener๋Š” Trigger ๋ฐœ์ƒ์ด๋‚˜ ์™„๋ฃŒ, ํ˜น์€ ๋ถˆ๋ฐœ ์‹œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

6. Jobstore

 - Job๊ณผ Trigger ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ, ์ €์žฅ์†Œ


์ฟผ์ธ ์˜ ๋ฌธ์ œ์ ?

์ฟผ์ธ  ์Šค์ผ€์ค„ ์‹คํ–‰์— ๋Œ€ํ•œ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค. ์Šค์ผ€์ฅด ์‹คํ–‰์— ๋Œ€ํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์„œ๋น„์Šค ๋‹จ์— ์‹คํ–‰๊ณผ ๊ด€๋ จํ•œ ๋กœ๊ทธ๋ฅผ ๊ตฌํ˜„ํ•œ ๋’ค, ADMIN UI๋ฅผ ์ง์ ‘ ๊ฐœ๋ฐœํ•˜์—ฌ ๊ด€๋ฆฌํ•˜์—ฌ์•ผํ•œ๋‹ค. ์‹ค์ œ๋กœ ํ˜„์žฌ ํšŒ์‚ฌ์—์„œ๋Š” ์ฟผ์ธ  ์Šค์ผ€์ฅด๋Ÿฌ ์‹คํ–‰์— ๋Œ€ํ•œ ์„ฑ๊ณต ์—ฌ๋ถ€๋‚˜, ์†ก์ˆ˜์‹  ๋ฐ์ดํ„ฐ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ UI๊ฐ€ ๋”ฐ๋กœ ๊ฐœ๋ฐœ ๋˜์–ด์žˆ๋‹ค.

 


 

์ฟผ์ธ  ๊ตฌํ˜„ ๋ฐฉ๋ฒ• : XML์„ ์ด์šฉํ•œ Quartz Scheduler ๊ตฌํ˜„

 

1. Quartz library ํŒŒ์ผ ์ถ”๊ฐ€

 ์ฟผ์ธ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ์œ„ํ•˜์—ฌ ํŒŒ์ผ ํ˜น์€ dependency ์ถ”๊ฐ€. ์ฟผ์ธ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์€ ํ•˜๋‹จ์˜ URL์—์„œ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

(quartz๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•˜์—ฌ์„œ๋Š” slf4j-api jar๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ ์ฐธ๊ณ ํ•˜๋„๋ก ํ•˜์ž!)

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹ค์šด๋กœ๋“œ URL : http://www.quartz-scheduler.org/downloads/ 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

 

 

2. ์‹คํ–‰ํ•  Job class ๊ตฌํ˜„

public class BatchServiceImpl implements BatchService {

    public void sendSmsMessageList() throws Exception {
    	SimpleDateFormat format = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
    	Date time = new Date();
    	String currentTime = format.format(time);
    	System.out.println(currentTime); //ํ˜„์žฌ์‹œ๊ฐ„ ์ถœ๋ ฅ
    }
}

 

 

3. Quartz.xml ํŒŒ์ผ ๊ตฌํ˜„

<bean id="quartzTestServiceMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <!-- Job ๊ตฌํ˜„ํ•œ class ๊ฐ์ฒด์˜ bean ์ด๋ฆ„์„ ์„ค์ •ํ•œ๋‹ค -->
    <property name="targetObject"><ref bean="batchService" /></property>
    <!-- ํ•ด๋‹น class์—์„œ ์‹คํ–‰ํ•  ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์งˆ ๋ฉ”์†Œ๋“œ๋ฅผ ์…‹ํŒ…ํ•œ๋‹ค. -->
    <property name="targetMethod"><value>sendSmsMessageList</value></property>
    <!-- ๋™์‹œ ์‹คํ–‰ ๋ฐฉ์ง€ ์˜ต์…˜ 
    ๋‹ค์ˆ˜์˜ Job์„ ๋™์‹œ์— ๋ฐœ์ƒ์‹œํ‚ค๋ ค๋ฉด true๋กœ ์„ค์ •ํ•˜๊ณ , ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐœ์ƒ์‹œํ‚ค๋ ค๋ฉด false๋กœ ์„ค์ •ํ•œ๋‹ค
    (ํ•˜๋‹จ์—์„œ ์ด์™€ ๊ด€๋ จํ•œ ํ…Œ์ŠคํŠธ ์˜ˆ์ •) -->
    <property name="concurrent"><value>false</value></property>
</bean>
<!-- Trigger์„ค์ •. cronTrigger๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฉฐ, 30์ดˆ๋งˆ๋‹ค ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ•จ -->
<bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail"><ref bean="quartzTestServiceMethod" /></property>
    <property name="cronExpression"><value>0/30 * * * * ?</value></property>
</bean>
<!-- ์Šค์ผ€์ฅด๋Ÿฌ ์„ค์ •. ์œ„์—์„œ ์„ค์ •ํ•œ ํŠธ๋ฆฌ๊ฑฐ์˜ bean id๋ฅผ ref bean์— ์ž‘์„ฑ -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="quartzTestTrigger"/>
        </list>
    </property>
</bean>

 

 

4. ๊ตฌ๋™

 ์‹ค์ œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด, console์— 30์ดˆ๋งˆ๋‹ค current Time์ด ์ฐํžˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


 

Cron Expression

 

Cron ํ‘œํ˜„์‹ ๊ธฐ๋ณธ๊ตฌ์กฐ๋Š” 6~7์ž๋ฆฌ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.

 *     *     *     *    *      *      *
์ดˆ    ๋ถ„   ์‹œ   ์ผ   ์›”   ์š”์ผ  ๋…„๋„(์ƒ๋žต๊ฐ€๋Šฅ)

 

ํ‘œํ˜„์‹์˜ ๋ฒ”์œ„

์ดˆ(Seconds) 0~59
๋ถ„(Minutes) 0~59
์‹œ๊ฐ„(Hours) 0~23
๋‹ฌ์˜ ๋‚ ์งœ(Day-of-month) 1~31
๋‹ฌ(Month) 1~12 / JAN~DEC
์ฃผ์˜ ๋‚ ์งœ(Day-of-week) 1~7 / SUN~SAT

 

 

ํ‘œํ˜„์‹์˜ ์˜ˆ์ œ

 0 0 10 * * * ๋งค์ผ 12์‹œ ์‹คํ–‰
 0 15 09  * * *  ๋งค์ผ 09์‹œ 15๋ถ„์— ์‹คํ–‰
 0 * 14 * * * ๋งค์ผ 14์‹œ์— 0๋ถ„~59๋ถ„๊นŒ์ง€ ๋งค๋ถ„ ์‹คํ–‰
 0 0/5 14 * * * ๋งค์ผ 14์‹œ์— ์‹œ์ž‘ํ•ด์„œ 5๋ถ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์‹คํ–‰
 0 0/5 14, 18 * * * ๋งค์ผ 14์‹œ, 18์‹œ์— ์‹œ์ž‘ํ•ด์„œ 5๋ถ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์‹คํ–‰
 0 0-5 14 * * *  ๋งค์ผ 14์‹œ์— 0,1,2,3,4,5๋ถ„์— ์‹คํ–‰
 0 0 20 ? * MON-FRI ์›”์š”์ผ~๊ธˆ์š”์ผ 20์‹œ 0๋ถ„ 0์ดˆ์— ์‹คํ–‰
 * /1 * * * * ๋งค 1๋ถ„๋งˆ๋‹ค ์‹คํ–‰
 * ./10 * * * * ๋งค 10๋ถ„๋งˆ๋‹ค ์‹คํ–‰
 0/30 * * * * ?
๋งค 30์ดˆ๋งˆ๋‹ค ์‹คํ–‰
 0 0,10,20,30,40,50 * * * ?  ๋งค 10๋ถ„๋งˆ๋‹ค ์‹คํ–‰
 0 0,20,40 * * * ?  ๋งค 20๋ถ„๋งˆ๋‹ค ์‹คํ–‰
 0 0 1 * * ? ๋งค์ผ 1ํšŒ 01์‹œ ์‹คํ–‰
 0 30 1 * * ? ๋งค์ผ 1ํšŒ 1์‹œ 30๋ถ„ ์‹คํ–‰

 

 

References

https://jaeuk2274.tistory.com/48
https://hmjkor.tistory.com/286
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ljpark6&logNo=221883162795