스케쥴링을 하기 위하여서는 아래 몇가지 개념부터 먼저 잡고 넘어가야한다.
job : 이것은 독립적인 작업단위로서 job은 지정된 단위간격을 주기로 실행이 되여진다.
trigger : job의 실행을 하기위한 조건을 명시한다. 이런 조건은 단순히 고정된 시간으로 구성이 되여질수 도 있고 아니면 복잡한 데이타로 구성이 되여질수도 있다.
scheduler : trigger의 집합으로써 직책은 전체 스케쥴링 시스템을 관리하는것이다.
Spring은 여러가지 보조적 클래스를 이용하여 Timer와 연동하여 사용되여진다.
ScheduledTimerTask와 TimerTask가 그 가장 대표적인 보조클래스이다.
또한 TimerFactoryBean을 통하여 Spring은 자동적으로 지정된 trigger한테 새로운 공유된 Timer 인스턴스를 생성해주고 Timer는 이런 Trigger 를 이용하여 해당 job을 실행해준다.
ApplicationContextTimer.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 주입시킬 클래스를 선언적 방식으로 명시하였다. -->
<bean id="generatorJob"
class="com.xxx.nnserp.spring.SmsTransferLegacy">
</bean>
<!-- MethodInvokingTimerTaskFactoryBean을 사용하여
generatorJob의 동적 프록시를 생성하였으며 TimerTask의 특성을 가지게 하였다. -->
<bean id="generatorJobProxy"
class="org.springframework.scheduling.timer.
MethodInvokingTimerTaskFactoryBean">
<property name="targetObject">
<ref local="generatorJob"/>
</property>
<property name="targetMethod">
<value>send</value>
</property>
<property name="arguments">
<value>xxx</value>
</property>
</bean>
<!-- 실제 타이머태스크가 작동할 시간단위를 설정해준다. -->
<bean id="repeatingTrigger"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- 시동후 20초후 작업을 실행한다. -->
<property name="delay">
<value>20000</value>
</property>
<!-- 매 5초마다 작업을 실행한다. -->
<property name="period">
<value>5000</value>
</property>
<!-- 위에서 선언한 generatorJobProxy를 timerTask에 주입시킨다. -->
<property name="timerTask">
<ref local="generatorJobProxy" />
</property>
</bean>
<!-- 스케쥴러속성에 타임태스크와 반복설정관련 트리거를 추가해준다. -->
<bean id="scheduler"
class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref local="repeatingTrigger" />
</list>
</property>
</bean>
</beans>
ApplicationContextTimer.xml 는 Spring의 ApplicationContext에 대한 설정파일로서 이 예제에서는 실제 타이머 어떻게 작동할것인지에 대한 룰들을 정의하고 또한 어느 클래스에 대하여 스케쥴링을 할것인지를 설정해준다.
SmsTransferLegacy.java
public void send(String args)
{
System.out.println(LibDatetime.getTimeString() + " 시각에 " + args +
"에 SMS 발송!");
}
}
SmsTransferLegacy.java 클래스는 사실상 주기적으로 실행이 되여져야 할 클래스로서 이 예제에서는 단순히 실행이 되여질때마다 타임스템프를 출력시키는것으로 구현했다.
댓글 없음:
댓글 쓰기