Quartz定时任务调用于及与Spring的整合

Quartz定时任务调用以及与Spring的整合
    Quartz就像一个定时器,经常用于处理一些需要定时重复执行的业务。它有3个主要概念:调度器,触发器和任务。先下载quartz.jar文件或使用Maven:
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>1.8.0</version>
</dependency>
    新建一个Java项目,将下载好的quartz.jar导入。首先我们建立一个简单的任务,任务的接口是Job类。

Java Code:
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SimpleQuartzJob implements Job {

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
  System.out.println("In SimpleQuartzJob - executing its JOB at "
                + new Date() + " by " + context.getTrigger().getName());
}

}
1.去实现Quartz的Job接口,在execute方法中写你要执行的业务逻辑。
2.创建触发器和调度器来执行定时任务。

Java Code:
import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;

public class Main {

public static void main(String[] args) throws SchedulerException {
  //get a scheduler
  SchedulerFactory schedulerFactory = new StdSchedulerFactory();
  Scheduler scheduler = schedulerFactory.getScheduler();
  //new a job
  JobDetail jobDetail = new JobDetail("jobDetail-s1","jobDetailGroup-s1", SimpleQuartzJob.class);
  //new a trigger
  SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger", "triggerGroup-s1");
  //set the start time
  long ctime = System.currentTimeMillis();
  simpleTrigger.setStartTime(new Date(ctime));
  //set the interval
  simpleTrigger.setRepeatInterval(10000);
  //set the count
  simpleTrigger.setRepeatCount(10);
  //set the priority, default is 5
  simpleTrigger.setPriority(5);
  scheduler.scheduleJob(jobDetail, simpleTrigger);
 
  scheduler.start();
}

}
    在该类中,先初始化一个SchedulerFactory类的对象,再由它得到一个Scheduler对象。接着再分别创建一个Job和Trigger。注意在创建Job的过程中需要用到之前定义的SimpleQuartzJob,已告知JobDetail具体需要执行的逻辑代码是SimpleQuartzJob中的execute方法。然后可以定义些执行参数,如:startTime开始时间,repeatInterval重复执行间隔,repeatCount重复执行次数及优先级Priority等。最后将job和trigger通过scheduleJob交给scheduler来执行即可。

如何在Spring环境中集成Quartz?
    首先确保你的Spring环境中已经有Spring-context-support.jar这个jar文件。这个jar中包含了Spring对于quartz的支持。
    接着就能在Spring的配置文件中建立如下配置:
    <bean id="configRefreshJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
       <property name="targetObject">
           <ref bean="configUtil" />
       </property>
       <property name="targetMethod">
           <value>refreshConfig</value>
       </property>
    </bean>
   
    <bean id="configRefreshJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
       <property name="jobDetail">
           <ref bean="configRefreshJobDetail" />
       </property>
       <property name="cronExpression">
           <value>5 * * * * ?</value>
       </property>
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
       <property name="triggers">
           <list>
              <ref local="configRefreshJobTrigger" />
           </list>
       </property>
    </bean>
    其中MethodInvokingJobDetailFactory这个对象其实就类似于Job。targetObject指向的是BeanFactory中的某一对象比如说是configUtil,而targetMethod指明了要重复执行的方法,是configUtil对象中的refreshConfig方法。这样一个Job就定义好了,这里能访问Spring工厂中已有的bean最为Job的对象,而且也不用我们手动去创建Job,已传统的Spring配置文件的方式来定义个Job的bean。CronTriggerBean其实就等同于之前的Trigger,这里Spring为我们做了封装,通过jobDetail可以指定任务对象,就是之前的configRefreshJobDetail, cronExpression表达式可以指定循环时间,这比之前指定repeatInterval的方式要灵活得多了。最后将configRefreshJobTrigger对象交给SchedulerFactoryBean对象即可。我们不需要手动去调用,只要存在SchedulerFactoryBean对象,spring容器会自动为我们启动其内部的Trigger。