您的位置:首页 > 编程语言 > Java开发

Spring (七) Quartz任务调度器及其在Spring中的使用

2017-06-21 11:43 411 查看

一、原生的quartz框架的使用:

1.导入jar包:可以去quartz官网下载

2.创建Java类,实现Job接口中的execute方法

[java]
view plain
copy

package com.wzj.prototype.task;  
  
import org.quartz.Job;  
import org.quartz.JobExecutionContext;  
import org.quartz.JobExecutionException;  
/** 
 * 自定义任务类 
 */  
public class MyJob implements Job{  
  
    @Override  
    public void execute(JobExecutionContext arg0) throws JobExecutionException {  
        System.out.println("起床啦~");  
    }  
      
}  

3.测试类中代码如下:

[java]
view plain
copy

package com.wzj.prototype.test;  
  
import java.util.Calendar;  
  
import org.quartz.CronScheduleBuilder;  
import org.quartz.JobBuilder;  
import org.quartz.JobDetail;  
import org.quartz.Scheduler;  
import org.quartz.SchedulerException;  
import org.quartz.SimpleScheduleBuilder;  
import org.quartz.Trigger;  
import org.quartz.TriggerBuilder;  
import org.quartz.impl.StdSchedulerFactory;  
import org.quartz.impl.calendar.HolidayCalendar;  
  
import com.wzj.prototype.task.MyJob;  
  
public class PrototypeDemo {  
  
    /** 
     * @param args 
     * @throws SchedulerException  
     */  
    public static void main(String[] args) throws SchedulerException {  
          
        /** 
         * 一、创建调度器 
         * 用来绑定触发器和任务,任务调度离不开这三个对象:任务、触发器、调度器 
         */  
        Scheduler scheduler=new StdSchedulerFactory().getScheduler();  
        /** 
         * 二、创建JobDetail任务对象 
         * 1.使用JobBuilder.newJob()方法创建JobBuilder对象 
         * 2.ofType():指定任务 的类型 
         * 3.withIdentity():为任务指定标识,便于管理 
         *   param1:任务的名称 
         *   param2:任务所在组 
         * 4.build():构建JobDetail对象 
         */  
        JobDetail jobDetail=JobBuilder.newJob()  
                            .ofType(MyJob.class)  
                            .withIdentity("myJob", "myJobGroup")  
                            .build();  
          
        /** 
         * 三、 创建Trigger触发器,即时间规则,分为SimpleScheduleBuilder和CronScheduleBuilder 
         * 1.startNow():立即开始,其中还包含很多开始的方法,可以自行查看 
         * 2.withSchedule():以什么规则定义触发器 
         *   SimpleScheduleBuilder中提供了多种静态方法,按照时、分、秒等方式定义,这里的参数: 
         *   param1:总共执行10次 
         *   param2:每3秒执行一次 
         */  
        Trigger simpleTrigger=TriggerBuilder.newTrigger()  
                              .startNow()  
                              .withIdentity("trigger","triggerGroup")  
                              .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(10, 3))  
                              .build();  
        /** 
         * 使用调度器绑定并启动调度器 
         */  
        scheduler.scheduleJob(jobDetail, simpleTrigger);  
        scheduler.start();  
          
    }  
  
}  

输出结果:打印了10次“起床啦~”
4.使用CronScheduleBuilder定义时间规则:

[java]
view plain
copy

Trigger cronTrigger=TriggerBuilder.newTrigger()  
                .startNow()  
                .withIdentity("trigger2", "triggerGroup")  
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 44 16 29 1 ? 2015"))  
                .build();  

使用CronScheduleBuilder只需要定义好Cron表达式就可以了,即方法中传递的字符串。Cron表达式由6~7个由空格分隔的时间元素组成,第7个元素可选



欲了解更详细,参见百度文库:http://wenku.baidu.com/link?url=vLPUSfBOmRUXE6PwKcPw0UZaHtSdtbeVW0QpVw8cuCV9J04jrLNW_2WNKbUf3xs-l1bwLDtOMnjLT3Cyppx7THess6O3DY2oqQcPHkjlPk_
SimpleScheduleBuilder和CronScheduleBuilder的区别:
触发器应用场景使用方式
SimpleTrigger固定时间间隔的调度任务(例如:每隔2小时执行1次)通过设置触发器的属性:开始时间、结束时间、重复次数、重复间隔等
CronTrigger指定时间点的调度任务(例如:每天凌晨1:00执行1次)通过定义Cron表达式
5.使用Calendar排除特殊时间

如果有时候比如10月1日——国庆节,我们不想让这个任务执行,此时就要排除掉这个特殊的日期

代码如下:

[java]
view plain
copy

public static void main(String[] args) throws SchedulerException {  
    //省略其他  
      
    //创建一个java.util.Calendar日历类,并设置日期时间  
    Calendar calendar=Calendar.getInstance();   
    calendar.set(Calendar.MONTH, Calendar.OCTOBER);  
    calendar.set(Calendar.DATE, 1);  
    //创建假期日历,用来排除以上的时间  
    HolidayCalendar holiday=new HolidayCalendar();  
    holiday.addExcludedDate(calendar.getTime());  
    //在调度器中注册  
    scheduler.addCalendar("guoQing", holiday, true, true);  
      
    Trigger simpleTrigger=TriggerBuilder.newTrigger()  
              //省略其他  
              .modifiedByCalendar("guoQing")//【千万不要忘记在这里注明时间法则根据此日历进行调整】  
              .build();  
    /** 
     * 使用调度器绑定并启动调度器 
     */  
    scheduler.scheduleJob(jobDetail, simpleTrigger);  
    scheduler.start();  
}  

二、在spring中使用Quartz

1.加入spring所需jar包,创建一个MyJob类,此时,不用实现任何接口:

[java]
view plain
copy

package com.wzj.spring.task;  
/** 
 * 创建普通类,不必实现接口 
 */  
public class MyJob {  
    //方法自定义  
    public void remind(String name){  
        System.out.println(name+",快起床!");  
    }  
}  

2.配置spring配置文件applicationContext.xml:

[html]
view plain
copy

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">  
    <!-- 
        1.创建一个任务对象的bean,spring提供了MethodInvokingJobDetailFactoryBean类 
     -->  
    <bean id="myJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <!-- 提供了targetObject和targetClass类型指定自定义类 -->  
        <property name="targetObject">  
            <!-- 为了方便,就在此定义了个内部bean -->  
            <bean class="com.wzj.spring.task.MyJob"/>  
        </property>  
        <!-- 指定任务方法 -->  
        <property name="targetMethod" value="remind"/>  
        <!-- 为方法传递参数 -->  
        <property name="arguments">  
            <list>  
                <value>Jack</value>  
            </list>  
        </property>  
    </bean>  
      
    <!-- 2.创建触发器对象 ,spring提供了SimpleTriggerFactoryBean类-->  
    <bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">  
        <!-- 1000毫秒之后执行 -->  
        <property name="startDelay" value="1000"/>  
        <!-- 隔多长时间重复一次 -->  
        <property name="repeatInterval" value="3000"/>  
        <!--  
            总共重复多少次!注意,是【重复】!也就是说会执行6次,这点与java中有些不同,java中时【总共】执行多少次。 
         -->  
        <property name="repeatCount" value="5"/>  
        <!-- 这里和java里面略微不同,在这里直接关联上任务,然后在与调度器关联的时候只关联触发器就行了 -->  
        <property name="jobDetail" ref="myJob"/>  
    </bean>  
    <!-- 3.创建调度器,spring提供了SchedulerFactoryBean类 -->  
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
        <property name="triggers">  
            <list>  
                <ref bean="trigger"/>  
            </list>  
        </property>  
    </bean>  
</beans>  

3.Main方法中只要写一句启动spring容器的代码就可以了,spring容器在气动式会自动的为我们创建任务调度的各个实例

[java]
view plain
copy

public static void main(String[] args) {  
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");  
}  

4.结果:输出6次“Jack,快起床!”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: