Spring에서 시간 스케줄링을 실현하는 몇 가지 방법

8578 단어 spring정시
1, 내용 소개
이른바 정시 스케줄링이란 아무도 지키지 않을 때 시스템이 특정한 기능을 어느 순간에 집행할 수 있는 메커니즘을 말한다. 전통적인 개발에 있어 정시 스케줄링의 조작은 두 가지 형식으로 나뉜다.
시간 트리거: 특정한 시간에 특정한 처리 조작을 실행한다.
간격 트리거: 몇 초 간격으로 특정 동작을 자동으로 처리합니다.
모든 처리는 컴퓨터 시스템 밑바닥의 시계 발생기에 의존한다. 자바의 최초의 실현 과정에서 정시 처리에 두 가지 종류가 있다. 그것이 바로 Timer,TimerTask 두 종류이다. 그 중에서 TimerTask는 주로 임무의 집행을 정의하고 특정한 임무를 수행하는 라인을 시작하는 것과 같다.

public class MyTask extends TimerTask{

  @Override

  public void run() {// 

    // TODO Auto-generated method stub

    String currentTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());

    System.out.println(currentTime);

  } 

}

public class MyTaskTest {

  public static void main(String[] args) {

    Timer timer=new Timer();

    timer.schedule(new MyTask(), 1000);// , 1 。

  } 

}

그러나 매년 어느 달 어느 때 어느 분 어느 초에 어떤 임무를 수행해야 한다고 요구하면 Timer와 TimerTask를 사용하면 무능하다.프로젝트 개발에서 종종 두 가지 정시 제어 선택이 있다.
quartz 구성 요소: 기업 및 정시 스케줄링 구성 요소, 단독 설정이 필요합니다.
SpringTask: 간단한 구성 요소로 Annotation을 사용하여 구성 처리를 수행할 수 있습니다.
2, Quartz 정의 시간 스케줄링
Quartz 구성 요소를 사용하려면,quartz의 개발 패키지를 가져와야 합니다.pom.xml에quartz를 추가한 개발 패키지입니다.

<dependency>

      <groupId>org.quartz-scheduler</groupId>

      <artifactId>quartz</artifactId>

      <version>2.2.3</version>

</dependency>
가방을 도입하면 정시 스케줄링 개발이 가능하다.
두 가지 구현 모델이 있습니다.
Quartz JobBean 부류 계승하기;
설정을 직접 이용하면 방법의 스케줄링 제어를 실현할 수 있다.
1, 상위 클래스 구현 작업의 처리를 계승합니다.

public class MyTask2 extends QuartzJobBean{

  @Override

  protected void executeInternal(JobExecutionContext context) throws JobExecutionException {

    // TODO Auto-generated method stub

        String currentTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());

        System.out.println(currentTime);

        System.out.println(" !!!");

  }

}
모든 시간 스케줄링 설정은 스프링의 제어 파일에서 이루어져야 합니다. 즉, 시간 작업 설정을 위해 명확한 클래스를 쓸 필요가 없습니다.
2, applicationContext.xml 파일에 시간 스케줄링 설정을 추가하고 시간 스케줄링 공장 클래스를 통해 실현합니다.

<bean id="taskFactory"

    class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

    <property name="jobClass" value="cn.wnh.timerSask.MyTask1" />

    <property name="jobDataMap">

      <map>

        <entry key="timeout" value="0" />

      </map>

    </property>

  </bean>
다음에 작업의 트리거 작업을 구성합니다. 작업의 구성에는 두 가지 종류가 있습니다.
사용 간격 트리거: 몇 시간 후 반복 실행;
공장류: org.springframework.scheduling.quartz.SimpleTriggerFactoryBean

<bean id="simpleTrigger"

    class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">

    <!--   -->

    <property name="jobDetail" ref="taskFactory"></property>

    <!--   -->

    <property name="startDelay" value="0"></property>

    <!--  ” “ -->

    <property name="repeatInterval" value="2000"></property>

  </bean>
간격 트리거 스케줄러 설정:org.springframework.scheduling.quartz.SchedulerFactoryBean

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

    <property name="triggers">

      <list>

        <ref bean="simpleTrigger" />

      </list>

    </property>

  </bean>
3, 이때 모든 간격 트리거 제어는 Spring에 의해 관리됩니다. 이제 Spring 용기를 시작하기만 하면 간격 트리거 작업을 수행할 수 있습니다.
Cron을 사용하여 타이밍 트리거
Quartz는 간격 촉발을 실현할 수 있을 뿐만 아니라 Cron과 결합하여 정시 촉발을 실현할 수 있는데 이것도 그의 가장 중요한 기능이다.
일반 프로젝트에서 가장 많이 사용하는 모델: 시간 촉발, 월 초 촉발, 연초 촉발.
이전의 간격 트리거 설정을 수정하고 CronTriggerFactoryBean을 사용하여 시간 트리거를 실현합니다.

<bean id="taskFactory"

    class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

    <property name="jobClass" value="cn.wnh.timerSask.MyTask1" />

    <property name="jobDataMap">

      <map>

        <entry key="timeout" value="0" />

      </map>

    </property>

  </bean>

  <bean id="cronTrigger"

    class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

    <property name="jobDetail" ref="taskFactory" />

    <!-- cron ,  -->

    <property name="cronExpression" value="0 * * * * ?" />

  </bean>

  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

    <property name="triggers">

      <list>

        <ref bean="cronTrigger" />

      </list>

    </property>

  </bean>

Spring 컨테이너를 실행하면 됩니다.
2, 어떤 종류도 계승하지 않고 정시 스케줄링을 실현한다
프로젝트 개발에서 계승은 단계승의 제한된 제어를 초래할 수 있기 때문에 이런 상황에서 스프링은 어떤 종류도 계승하지 않고 정시 조작을 실현할 수 있는 임무 처리를 제공했다.
작업 실행 클래스를 정의합니다. 어떤 클래스도 계승하지 않습니다.

public class MyTask2 {

  public void taskSelf(){

    String task=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new java.util.Date());

    System.out.println(task);

    System.out.println(" ");

  }

}

애플리케이션 컨텍스트에서xml 공장 클래스 설정: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

<bean id="taskFactory2"

    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

    <property name="targetObject">

      <bean class="cn.wnh.timerSask.MyTask2" />

    </property>

    <!--  -->

    <property name="targetMethod" value="taskSelf" />

  </bean>

다음 작업 스케줄링 설정에 새 프로그램 클래스 설정

<bean id="cronTrigger"

    class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

    <property name="jobDetail" ref="taskFactory2" />

    <!-- cron ,  -->

    <property name="cronExpression" value="* * * * * ?" />

  </bean>
용기를 가동하면 정시 스케줄링을 실현할 수 있다.
이런 모델은 유형의 계승 의존이 없기 때문에 처리가 더욱 유연해질 것이다.
Spring Task 스케줄링
Spring에서는 스케줄링에 대한 지원이 있어서 Quartz보다 사용하기에 더 좋은 것 같습니다.
그것은 두 가지 실현 방식이 있다. 하나, 응용 프로그램 Context에서.xml에서 설정 실현;2, Annotation을 사용하여 구현합니다.
그러나 어떤 패턴을 사용하려면 반드시 먼저 임무 처리 클래스가 있어야 한다.
작업 처리 클래스를 정의합니다.
이전 MyTask2 클래스를 그대로 사용하고 다시 쓰지 않습니다. 
응용 프로그램 컨텍스트를 수정합니다.xml 파일:
추가 task 처리가 필요한 네임스페이스 정의:

 <beans xmlns:task="http://www.springframework.org/schema/task"

http://www.springframework.org/schema/task

http://www.springframework.org/schema/task/spring-task-4.1.xsd > 
1task 작업의 설정을 설정하여 간격 트리거를 실현합니다.

<bean id="myTask" class="cn.wnh.timerSask.MyTask2" />

  <task:scheduled-tasks>

    <task:scheduled ref="myTask" method="taskSelf"

      fixed-rate="2000" />

  </task:scheduled-tasks>
cron을 사용하여 정시 촉발

<bean id="myTask" class="cn.wnh.timerSask.MyTask2" />

  <task:scheduled-tasks>

    <task:scheduled ref="myTask" method="taskSelf" cron="* * * * * ?" />

  </task:scheduled-tasks>
이를 통해 SpringTask는 더욱 간단하게 구현됩니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기