📕 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>

 

 

두개의 trigger에 대한 console log

 

하나의 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>