레이블이 Timer인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Timer인 게시물을 표시합니다. 모든 게시물 표시

2007년 2월 27일 화요일

Spring과 Timer 사이의 연동으로 인한 스케쥴링

스케쥴링을 하기 위하여서는 아래 몇가지 개념부터 먼저 잡고 넘어가야한다.
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 class SmsTransferLegacy {

       public void send(String args)

       {

             System.out.println(LibDatetime.getTimeString() + " 시각에 " + args +

                                                                                                          "에 SMS 발송!");

       }

 

}


SmsTransferLegacy.java 클래스는 사실상 주기적으로 실행이 되여져야 할 클래스로서 이 예제에서는 단순히 실행이 되여질때마다 타임스템프를 출력시키는것으로 구현했다.