📕 Language/Java
[Java] xml을 이용한 Quartz Job Scheduler 설정 - concurrent 관련 테스트
a n u e
2022. 2. 9. 10:23
<!-- quartz job scheduler test (매 30초 마다 실행 ) -->
<bean id="quartzTestServiceMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject"><ref bean="dreamBatchService" /></property>
<property name="targetMethod"><value>sendSmsMessageList</value></property>
<property name="concurrent"><value>true</value></property>
</bean>
<!-- trigger 1 : cronTrigger 방식 -->
<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>
<!-- trigger 2 : simpleTrigger 방식 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail"><ref bean="quartzTestServiceMethod"/></property>
<property name="startDelay"><value>10000</value></property>
<property name="repeatInterval"><value>40000</value></property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="quartzTestTrigger"/>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
하나의 Job에 quartzTestTrigger/simpleTrigger라고 명명한 두개의 Trigger를 설정해보았다.
코드 상의 5번째 줄인 true 을 주목해보자.
<property name="concurrent"><value>true</value></property>
이렇듯, 하나의 Job에 다수의 Trigger를 걸게 되는 경우, 첫번째 Trigger에 대한 Job이 끝나기도 전에 두번째 Trgger에 대한 Job이 실행되는 문제가 발생할 수 있다.
노랑색으로 하이라이트된 것들이두번째 trigger인 simpleTrigger에 대한 로그다. 마지막 두 줄을 확인하면 보다시피 첫번째 trigger인 quartzTestTrigger와 중복으로 실행되고 있는 것을 알 수 있다.
이와 같은 문제를 방지하기 위하여 Quartz에서는 동시실행 여부를 제어할 수 있는 property 요소를 제공하는데, 그것이 바로 concurrent 이다. 하단과 같이 값을 true에서 false로 변경해보고 다시 실행해보면, 중복 실행이 되지 않는 것을 확인할 수 있다.
<property name="concurrent"><value>false</value></property>