동적 수정 Spring 타이머

spring 의 Quartz 타 이 머 는 기능 이 매우 강해 서 특정한 년 월 일 시간 분 초 에 트리거 시간 을 발생 시 켜 사건 의 스케줄 을 완성 할 수 있 습 니 다. 마치 windows 에서 계획 한 작업 과 같 습 니 다.다음은 전형 적 인 Quartz 타이머 의 실현 을 살 펴 보 자.
1. 먼저 실행 되 는 클래스 를 실현 합 니 다. 이 클래스 는 타이머 스케줄 링 에 사 용 됩 니 다. 이 클래스 는 어떠한 클래스 나 인 터 페 이 스 를 계승 할 필요 가 없습니다. 코드 는 다음 과 같 습 니 다.

   
   
   
   
public TestQuartz {
      public void doSomething(){
        //TODO
      }
}

2. spring 프로필, 구체 적 인 설정

   
   
   
   
<!-- -->
<bean id="testQuarzt" class="test.testQuarzt" />

<!-- testQuarzt job -->
<bean id="testQuartzJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="testQuarzt" />
    <property name="targetMethod" value="doSomething" />
    <property name="concurrent" value="false" />
</bean>

<!-- job -->
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="testQuartzJob" />
    <property name="cronExpression">
        <value>0 0 6 * * ?<value>
    <property>
<bean>

<!-- -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
            <ref bean="testTrigger" />
      </list>
    </property>
</bean>

이렇게 되면 간단 한 Spring Quartz 타이머 가 완 성 됩 니 다. 이 타 이 머 는 매일 아침 6 시 에 test Quarzt 류 에서 doSomething 방법 을 조정 합 니 다. 왜 아침 6 시 에 마지막 으로 설명 합 니까?
그러나 이 타이머 가 tomcat 에 배치 되 어 있다 고 가정 하면 타이머 의 스케줄 링 시간 을 수정 하려 면 spring 설정 파일 을 수정 하고 tomcat 를 다시 시작 해 야 합 니 다. 사실은 우리 가 tomcat 를 다시 시작 할 조건 이 없 거나 특정한 수요 가 있 으 면 프론트 데스크 에서 스케줄 링 시간 을 직접 수정 해 야 할 때 가 많 습 니 다. 그러면 문제 가 발생 합 니 다.
그러나 우 리 는 세 심하게 관찰 해 보 았 습 니 다. 스케줄 링 시간 은 org. spring from work. scheduling. quartz. ronTriggerBean 과 같은 종류의 cron Expression 속성 이 타이머 의 스케줄 링 시간 을 제어 하고 있 습 니 다. 사실은 spring 은 프로필 을 불 러 올 때 org. spring from work. scheduling. quartz. scheduler Factory Bean 의 대상 을 생 성 할 것 입 니 다.org. springframework. scheduling. quartz. CrontriggerBean 의 대상 을 얻 을 수 있다 면 문 제 는 해결 할 수 있 을 것 같 습 니 다. 사실 우 리 는 이 대상 을 얻 는 것 이 매우 쉽 습 니 다. 이 두 대상 을 우리 의 클래스 에 주입 하기 만 하면 됩 니 다. 그리고 사실은 Scheduler Factory Bean 에서 우리 가 조작 하 는 데 편리 한 방법 을 많이 제공 합 니 다.
다음은 다음 과 같이 수정 할 것 이다.
1. TestQuartz 류 를 수정 하고 코드 는 다음 과 같 습 니 다.

   
   
   
   
public TestQuartz {

    private Scheduler scheduler;
  
    // , setter scheduler
    public void setScheduler(Scheduler scheduler) {
        this.scheduler = scheduler;
    }

    public void doSomething(){
        //TODO
    }

    public void resetJob(String cronExpression){
        // scheduler trigger, , , , bean 。
        CronTriggerBean trigger = (CronTriggerBean)scheduler.getTrigger("testTrigger",Scheduler.DEFAULT_GROUP);
        String originConExpression = trigger.getCronExpression();
        // , , rescheduleJob
        if(!originConExpression.equalsIgnoreCase(cronExpression)){
            trigger.setCronExpression(cronExpression);
            scheduler.rescheduleJob("testTrigger", Scheduler.DEFAULT_GROUP, trigger);
        }
    }

}

2. spring 프로필 의 수정 은 다음 과 같 습 니 다.

   
   
   
   
<!-- -->
<bean id="testQuarzt" class="test.testQuarzt">
    <property name="scheduler" ref="schedulerFactory" />
</bean>

<!-- testQuarzt job -->
<bean id="testQuartzJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="testQuarzt" />
    <property name="targetMethod" value="doSomething" />
    <property name="concurrent" value="false" />
</bean>

<!-- job -->
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="testQuartzJob" />
    <property name="cronExpression">
        <value>0 0 6 * * ?<value>
    <property>
<bean>

<!-- -->
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
            <ref bean="testTrigger" />
      </list>
    </property>
</bean>

이렇게 되면 이 동적 스케줄 러 가 완 성 됩 니 다. 다음은 다음 스케줄 러 형식 에 대한 문제 입 니 다.
필드 허용 값 허용 되 는 특수 문자  초. 0-59 , - * /  나누다 0-59 , - * /  시간. 0-23 , - * /  날짜. 1-31 , - * ? / L W C  월. 1-12 혹은 JAN-DEC , - * /  요일 1-7 혹은 SUN-SAT , - * ? / L C #  년 (선택 가능) 비우다 1970-2099 , - * / 
0 0 12 * * ?---------------매일 낮 12: 00 촉발  0 15 10 ? * *---------------매일 오전 10: 15 촉발  0 15 10 * * ?---------------매일 오전 10: 15 촉발  0 15 10 * * ? *---------------매일 오전 10: 15 촉발  0 15 10 * * ? 2005 년 중 매일 오전 10 시 15 분 에 촉발  0 * 14 * * ?---------------매일 오후 2 시 부터 2 시 59 분 사이 에 1 분 에 한 번 씩 촉발 합 니 다.  0 0/5 14 * * ?---------------매일 오후 2 시 부터 2 시 59 분 사이 에 5 분 마다 한번 촉발 합 니 다.  0 0/5 14,18 * * ?---------------매일 오후 2 시 부터 2 시 59 분, 6 시 부터 6 시 59 분 사이 에 5 분 마다 한 번 씩 촉발 합 니 다.  0 0-5 14 * * ?---------------매일 오후 2 시 부터 2 시 까지 매 분 에 한 번 씩 촉발 합 니 다.  0 10,44 14 ? 3 WED - 3 월 의 수요일 은 오후 2 시 와 2 시 44 분 에 촉발 된다  0 15 10 ? * 월요일 부터 금요일 까지 매일 오전 10: 15 촉발  0 15 10 15 * ?---------------매달 15 일 오전 10: 15 촉발  0 15 10 L * ?---------------매달 마지막 날 오전 10 시 15 분 에 촉발  0 15 10 ? * 매달 마지막 금요일 오전 10: 15 에 촉발  0 15 10 ? * 6L 2002 - 2005 - --- --- 2002, 2003, 2004 and 2005 년 매달 마지막 금요일 오전 10: 15 촉발  0 15 10 ? * 매달 셋째 금요일 오전 10: 15 에 촉발  0 0 12 1/5 * ?---------------매월 첫날 부터 5 일이 지난 낮 12 시 마다 촉발  0 11 11 11 11 ?---------------11 월 11 일 오전 11 시 11 분 마다 촉발.?
참고 자료:
   1.http://www.springframework.org Spring 공식 사이트   2.http://www.opensymphony.com/quartz/ Quartz 공식 사이트

좋은 웹페이지 즐겨찾기