Quartz结合Spring和不结合Spring

来源:互联网 发布:阿里云客服平台 编辑:程序博客网 时间:2024/05/07 19:47
原文:http://jiemyonline.blog.sohu.com/70215307.html

Quartz总体看来,大致包括:Job,JobDetail,Trigger,Scheduler。
一、不使用Spring的做法:
1.实现Job接口的类,它是完成调度的实际要做的具体事情。
package com.test.quartz;
 
import java.util.Date;
 
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
 
public class PrintLogQuartzJob implements Job {
 
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("In PrintLogQuartzJob - executing its JOB at "
                + new Date() + " by " + context.getTrigger().getName());
        System.out.println("TriggerType is " + context.getJobDetail().getJobDataMap().getString("triggerType"));
       
 

    }
   
    private String triggerType;
 
    public final String getTriggerType() {
        return triggerType;
    }
 
    public final void setTriggerType(String triggerType) {
        this.triggerType = triggerType;
    }
 
}
2.JobDetail,会包含具体Job中的一些参数,放在一个Map中:JobDataMap。
3.简单触发器,类似Timer,有延时和间隔时间。通过SchedulerFactory 获取调度Scheduler
package com.test.quartz;
 
import java.util.Date;
 
import org.quartz.CronExpression;
import org.quartz.CronTrigger;
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 SimpleQuartzRunner {
 
    /**
     * @param args
     */
    public static void main(String[] args) throws SchedulerException, Exception {
        new SimpleQuartzRunner().simpleTriggerTask();
 
    }
 
    public void simpleTriggerTask() throws SchedulerException, Exception {
        // Initiate a Schedule Factory
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // Retrieve a scheduler from schedule factory
        Scheduler scheduler = schedulerFactory.getScheduler();
 
        // current time
        long ctime = System.currentTimeMillis();
 
        // Initiate JobDetail with job name, job group, and executable job class
        JobDetail jobDetail = new JobDetail("jobDetail-1", "jobDetailGroup-1",
                PrintLogQuartzJob.class);
        jobDetail.getJobDataMap().put("triggerType","Simple");
        // Initiate SimpleTrigger with its name and group name
        SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger",
                "triggerGroup-1");
        // set its start up time
        simpleTrigger.setStartTime(new Date(ctime));
        // set the interval, how often the job should run (3 seconds here)
        simpleTrigger.setRepeatInterval(3000);
        // set the number of execution of this job, set to 10 times.
        // It will run 10 time and exhaust.
        simpleTrigger.setRepeatCount(10);
        // set the ending time of this job.
        // We set it for 60 seconds from its startup time here
        // Even if we set its repeat count to 10,
        // this will stop its process after 6 repeats as it gets it endtime by
        // then.
        // simpleTrigger.setEndTime(new Date(ctime + 60000L));
        // set priority of trigger. If not set, the default is 5
        // simpleTrigger.setPriority(10);
        // schedule a job with JobDetail and Trigger
        scheduler.scheduleJob(jobDetail, simpleTrigger);
 
        // start the scheduler
        scheduler.start();
        // System.out.println("Pause.");
        // scheduler.pauseJob("jobDetail-1","jobDetailGroup-1");
        // System.out.println("Sleep start.");
        // Thread.sleep(10000L);
        // System.out.println("Sleep end.");
        // System.out.println("Resume.");
        // scheduler.resumeJob("jobDetail-1","jobDetailGroup-1");
 
    }
}
4.克隆触发器。通过Linux的克隆表达式来定制。
package com.test.quartz;
 
import java.util.Date;
 
import org.quartz.CronExpression;
import org.quartz.CronTrigger;
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 CronQuartzRunner {
 
    /**
     * @param args
     */
    public static void main(String[] args) throws SchedulerException, Exception {
        new CronQuartzRunner().cronTriggerTask();
 
    }
 

    public void cronTriggerTask() throws SchedulerException {
        // Initiate a Schedule Factory
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // Retrieve a scheduler from schedule factory
        Scheduler scheduler = schedulerFactory.getScheduler();
 
        // current time
        long ctime = System.currentTimeMillis();
 
        // Initiate JobDetail with job name, job group, and executable job class
        JobDetail jobDetail = new JobDetail("jobDetail-2", "jobDetailGroup-2",
                PrintLogQuartzJob.class);
        jobDetail.getJobDataMap().put("triggerType","Cron");
        // Initiate CronTrigger with its name and group name
        CronTrigger cronTrigger = new CronTrigger("cronTrigger",
                "triggerGroup2");
        try {
            // setup CronExpression
//            CronExpression cexp = new CronExpression("0/5 * * ? 11 6L 2007-2008");
            CronExpression cexp = new CronExpression("0/5 * * ? 11 Mon#3 2007-2008");
            // Assign the CronExpression to CronTrigger
            cronTrigger.setCronExpression(cexp);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // schedule a job with JobDetail and Trigger
        scheduler.scheduleJob(jobDetail, cronTrigger);
 
        // start the scheduler
        scheduler.start();
    }
    /*
     * Cron 表达式包括以下 7 个字段:
     *
     * 1.秒 2.分 3.小时 4.月内日期 5.月 6.周内日期 7.年(可选字段)
     *
     * 特殊字符:    
     * Cron 触发器利用一系列特殊字符,如下所示:
     *
     * 反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。
     *
     *
     * 问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母
     *
     * L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。
     *
     * 在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。
     * 
     * 井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。
     *
     * 星号(*)字符是通配字符,表示该字段可以接受任何可能的值。
     *
     */
 
}

二、使用Spring,具体的调度的获取,JobDetail和触发器的生成都不用编码实现。
1.只有单一业务类的一个方法作为任务的情况,那么需要如下配置:
 <!-- quartz -->
  <bean id="exaBusiness" class="com.test.quartz.ExampleBusiness"/>
  <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
   <property name="targetObject" ref="exaBusiness" />
   <property name="targetMethod" value="doIt" />
   <property name="concurrent" value="true" />  
 </bean>
 <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
     <property name="jobDetail" ref="jobDetail" />
     <property name="startDelay" value="1000" />
     <property name="repeatInterval" value="1000" />
 </bean>
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="triggers">
         <list>
            <ref bean="simpleTrigger" />
         </list>
     </property>
 </bean> 
  <!-- quartz -->

package com.test.quartz;
 
public class ExampleBusiness {    
    public void doIt(){
        System.out.println("----------" + ExampleBusiness.class.getName());
    }
}

2.使用简单触发器的配置:
 <!-- quartz -->
  <bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean">
   <property name="jobClass" value="com.test.quartz.PrintLogQuartzJob" />
   <property name="name" value="exampleJob"/>
   <property name="group" value="def_group"/>
   <property name="jobDataAsMap">
     <map>
       <entry key="triggerType" value="Cron" />
     </map>
   </property>
 </bean>
 <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
     <property name="jobDetail" ref="exampleJob" />    
     <property name="startDelay" value="1000" />
     <property name="repeatInterval" value="1000" />
 </bean>
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="triggers">
         <list>
             <ref bean="simpleTrigger" />
         </list>
     </property>
 </bean> 
  <!-- quartz -->

package com.test.quartz;
 
import java.util.Date;
 
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
 
public class PrintLogQuartzJob implements Job {
 
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("In PrintLogQuartzJob - executing its JOB at "
                + new Date() + " by " + context.getTrigger().getName());
        System.out.println("TriggerType is " + context.getJobDetail().getJobDataMap().getString("triggerType"));
       
 

    }
   
    private String triggerType;
 
    public final String getTriggerType() {
        return triggerType;
    }
 
    public final void setTriggerType(String triggerType) {
        this.triggerType = triggerType;
    }
 
}
   
3.使用克隆触发器的配置:配置克隆表达式,Job同上。
 <!-- quartz -->
 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
     <property name="jobDetail" ref="exampleJob" />
     <property name="cronExpression" value="0/5 * * ? 11 Mon#2 2007-2008" />
 </bean> 
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="triggers">
         <list>
             <ref bean="cronTrigger" />
         </list>
     </property>
 </bean> 
  <!-- quartz -->
 4.完整的配置,两个触发器一起运行某一个JobDetail,如果不想并发需要设定属性concurrent为false。如果写的JobDetail对象实现了Stateful接口,调度就会按照OS中类似时间片的概念来工作,一个Scheduler完成,另一个再开始。
 <!-- quartz -->
  <bean id="exaBusiness" class="com.test.quartz.ExampleBusiness"/>
 
  <bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean">
   <property name="jobClass" value="com.test.quartz.PrintLogQuartzJob" />
   <property name="name" value="exampleJob"/>
   <property name="group" value="def_group"/>
   <property name="jobDataAsMap">
     <map>
       <entry key="triggerType" value="Cron" />
     </map>
   </property>
 </bean>
 <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
   <property name="targetObject" ref="exaBusiness" />
   <property name="targetMethod" value="doIt" />
   <property name="concurrent" value="true" />  
 </bean> 
 

 <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
 
     <property name="jobDetail" ref="exampleJob" />    
     <!-- property name="jobDetail" ref="jobDetail" /-->
 
     <property name="startDelay" value="1000" />
 
     <property name="repeatInterval" value="1000" />
 </bean>
 
 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
     <property name="jobDetail" ref="exampleJob" />
     <property name="cronExpression" value="0/5 * * ? 11 Mon#2 2007-2008" />
 </bean> 
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="triggers">
         <list>
             <ref bean="cronTrigger" />
             <ref bean="simpleTrigger" />
         </list>
     </property>
 </bean> 
  <!-- quartz -->
原创粉丝点击