• Quartz经典入门案列


    一、Quartz简介 

        Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等。Spring对Quartz的集成与其对JDK Timer的集成在任务、触发器和调度计划的声明式配置方面等都非常相似。 

        Quartz的核心由两个接口和两个类组成:Job和Scheduler接口,JobDetail和Trigger类。不同于JDK Timer,任务不是从实现一个Job接口的类实例开始运行,实际上Quartz在需要的时候才创建job类实例。可以使用JobDetail类来包装任 务状态,并传递一个信息给Job,或在一个Job的多次执行过程之间保存信息。 

    二、Quartz任务调度 

    1. 简单任务调度 

        在Quartz中创建一个任务并执行,只需要实现Job接口类,在其execute()方法中处理你的业务逻辑。下面举例说明。 

    HelloWorldJob.java 

    Java代码  收藏代码
    1. package com.learnworld.quartz;  
    2.   
    3. import org.quartz.Job;  
    4. import org.quartz.JobExecutionContext;  
    5. import org.quartz.JobExecutionException;  
    6.   
    7. public class HelloWorldJob implements Job {  
    8.   
    9.     public void execute(JobExecutionContext context) throws JobExecutionException {  
    10.                   //实现你的业务逻辑  
    11.         System.out.println("Hello!");  
    12.           
    13.     }  
    14. }  



    HelloScheduling.java 

    Java代码  收藏代码
    1. package com.learnworld.quartz;  
    2.   
    3. import java.util.Date;  
    4.   
    5. import org.quartz.JobDetail;  
    6. import org.quartz.Scheduler;  
    7. import org.quartz.SimpleTrigger;  
    8. import org.quartz.Trigger;  
    9. import org.quartz.impl.StdSchedulerFactory;  
    10.   
    11. public class HelloScheduling {  
    12.     public static void main(String[] args) throws Exception {  
    13.   
    14.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
    15.         scheduler.start();  
    16.   
    17.         JobDetail jobDetail = new JobDetail("helloWorldJob",  
    18.                 Scheduler.DEFAULT_GROUP, HelloWorldJob.class);  
    19.   
    20.         Trigger trigger = new SimpleTrigger("simpleTrigger",  
    21.                 Scheduler.DEFAULT_GROUP, new Date(), null,  
    22.                 SimpleTrigger.REPEAT_INDEFINITELY, 1000);  
    23.           
    24.         scheduler.scheduleJob(jobDetail, trigger);  
    25.   
    26.     }  
    27. }  



    需要说明几点: 

        1)开始使用StdSchedulerFactory来获取Scheduler的实例。每一个scheduler可以被启动(start)、中止 (stop)和暂停(pause)。如果一个scheduler没有被启动或已经被暂停,则没有触发器会被启用,所以首先使用start()方法启动 scheduler。 

        2)创建JobDetail实例。它的构造参数有三个,第一个是任务名,任务名可以被用作参数来应用需要暂停的任务;第二个是组名,组名可以用来引用一组被集合在一起的任务,这里采用缺省组名,每一个任务名在组内必须是唯一的;第三个参数是实现了特定任务的类。 

        3)创建Trigger实例。我们使用SimpleTrigger类,它提供了类似JDK Timer风格的触发器行为。它的构造参数有六个,第一个和第二个为触发器名和组名,和上面类似;第三个为任务开始时间;第四个为结束时间,如果设置为 空,表示不存在结束时间;第五个为重复次数,允许你指的触发器被触发的最大次数,使用REPEAT_INDEFINITELY允许触发器可以被触发无限 次;第六个是触发器运行的时间间隔,是毫秒数。 

        4)最后通过scheduler.scheduleJob()方法调度任务。 

    2. 使用JobDetail传递数据 

        每个JobDetail实例都有关联的JobDataMap实例,它实现了Map接口并允许通过键值来传递任务相关的数据。任务也可以修改JobDataMap中的数据,在同一任务的多次执行之间传递数据。下面举例说明。 

    MessageJob.java 

    Java代码  收藏代码
    1. package com.learnworld.quartz;  
    2.   
    3. import java.util.Map;  
    4.   
    5. import org.quartz.Job;  
    6. import org.quartz.JobExecutionContext;  
    7. import org.quartz.JobExecutionException;  
    8.   
    9. public class MessageJob implements Job {  
    10.   
    11.     public void execute(JobExecutionContext context) throws JobExecutionException {  
    12.           
    13.         Map properties = context.getJobDetail().getJobDataMap();  
    14.           
    15.         System.out.println("Previous Fire Time: " + context.getPreviousFireTime());  
    16.         System.out.println("Current Fire Time: " + context.getFireTime());  
    17.         System.out.println("Next Fire Time: " + context.getNextFireTime());  
    18.         System.out.println(properties.get("message"));  
    19.           
    20.     }  
    21. }  



    MessageScheduling.java 

    Java代码  收藏代码
    1. package com.learnworld.quartz;  
    2.   
    3. import java.util.Date;  
    4. import java.util.Map;  
    5.   
    6. import org.quartz.JobDetail;  
    7. import org.quartz.Scheduler;  
    8. import org.quartz.SimpleTrigger;  
    9. import org.quartz.Trigger;  
    10. import org.quartz.impl.StdSchedulerFactory;  
    11.   
    12. public class MessageScheduling {  
    13.     public static void main(String[] args) throws Exception {  
    14.   
    15.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
    16.         scheduler.start();  
    17.   
    18.         JobDetail jobDetail = new JobDetail("messageJob",  
    19.                 Scheduler.DEFAULT_GROUP, MessageJob.class);  
    20.           
    21.         Map map = jobDetail.getJobDataMap();  
    22.         map.put("message""This is a message from Quartz");  
    23.   
    24.         Trigger trigger = new SimpleTrigger("simpleTrigger",  
    25.                 Scheduler.DEFAULT_GROUP, new Date(), new Date("Sat, 12 Aug 2011 13:30:00 GMT+0430"),  
    26.                 SimpleTrigger.REPEAT_INDEFINITELY, 5000);  
    27.           
    28.         scheduler.scheduleJob(jobDetail, trigger);  
    29.   
    30.     }  
    31. }  



    3. 使用CronTrigger 

       上面提到了SimpleTrigger类,它提供了类似JDK Timer风格的触发器功能。Quartz的出色在于它使用CronTrigger提供了对复杂触发器的支持。 

        一个CronTrigger表达式,包含六个必须组件和一个可选组件。关于cron表达式,可以参考这篇文档:http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html 

       下面举例说明CronTrigger的使用。 

    CronWithCalendarScheduling.java 

    Java代码  收藏代码
    1. package com.learnworld.quartz;  
    2.   
    3. import java.util.Calendar;  
    4. import java.util.Date;  
    5. import java.util.Map;  
    6.   
    7. import org.quartz.CronTrigger;  
    8. import org.quartz.JobDetail;  
    9. import org.quartz.Scheduler;  
    10. import org.quartz.SimpleTrigger;  
    11. import org.quartz.Trigger;  
    12. import org.quartz.impl.StdSchedulerFactory;  
    13. import org.quartz.impl.calendar.HolidayCalendar;  
    14.   
    15. public class CronWithCalendarScheduling {  
    16.     public static void main(String[] args) throws Exception {  
    17.   
    18.         Calendar cal = Calendar.getInstance();  
    19.         cal.set(2010, Calendar.OCTOBER, 31);  
    20.           
    21.         HolidayCalendar calendar  = new HolidayCalendar();  
    22.         calendar.addExcludedDate(cal.getTime());  
    23.           
    24.         Scheduler scheduler = new StdSchedulerFactory().getScheduler();  
    25.         scheduler.start();  
    26.           
    27.         scheduler.addCalendar("calendar", calendar, truefalse);  
    28.           
    29.         JobDetail jobDetail = new JobDetail("messageJob",  
    30.                 Scheduler.DEFAULT_GROUP, MessageJob.class);  
    31.           
    32.         Map map = jobDetail.getJobDataMap();  
    33.         map.put("message""This is a message from Quartz");  
    34.   
    35.         String cronExpression = "3/5 * 17,18,19,20 * * ?";  
    36.           
    37.         Trigger trigger = new CronTrigger("cronTrigger",  
    38.                 Scheduler.DEFAULT_GROUP, cronExpression);  
    39.           
    40.         scheduler.scheduleJob(jobDetail, trigger);  
    41.     }  
    42. }  



    需要说明几点: 

        1)创建了HolidayCalendar实例,使用addExcluderData()方法排除了2010年10月31日。再使用addCalendar()方法,将这个Calendar加入到Scheduler中。 

        2)这个cron表达式的含义是,每天17:00-20:59之间每一分钟的第三秒开始运行,每五秒执行一次。 

    三. Spring对Quartz调度的支持 

        Spring对Quartz集成与其对JDK Timer调度集成类似,你可以在配置文件中配置任务调度。仅需要在程序里加载ApplicationContext,Spring会自动启动调度器。 

    quartz.xml 

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
    3. <beans>  
    4.     <bean id="job"  
    5.         class="org.springframework.scheduling.quartz.JobDetailBean">  
    6.         <property name="jobClass">  
    7.             <value> com.learnworld.quartz.MessageJob </value>  
    8.         </property>  
    9.         <property name="jobDataAsMap">  
    10.             <map>  
    11.                 <entry key="message">  
    12.                     <value>This is a message from Spring Quartz configuration!</value>  
    13.                 </entry>  
    14.             </map>  
    15.         </property>  
    16.     </bean>  
    17.     <bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
    18.         <property name="startDelay">  
    19.             <value>1000</value>  
    20.         </property>  
    21.         <property name="repeatInterval">  
    22.             <value>3000</value>  
    23.         </property>  
    24.         <property name="jobDetail">  
    25.             <ref local="job" />  
    26.         </property>  
    27.     </bean>  
    28.   
    29.     <bean id="schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    30.         <property name="triggers">  
    31.             <list>  
    32.                 <ref local="trigger" />  
    33.             </list>  
    34.         </property>  
    35.     </bean>  
    36. </beans>  



    SimpleSpringQuartzIntegration.java 

    Java代码  收藏代码
    1. package com.learnworld.quartz;  
    2.   
    3. import org.springframework.context.ApplicationContext;  
    4. import org.springframework.context.support.FileSystemXmlApplicationContext;  
    5.   
    6. public class SimpleSpringQuartzIntegration {  
    7.   
    8.     public static void main(String[] args) {  
    9.   
    10.         ApplicationContext ac = new FileSystemXmlApplicationContext("src/conf/quartz.xml");  
    11.     }  
    12.   
    13. }  



    需要说明几点: 

        1)采用JobDetailBean类,它扩展了JobDetai类,采用可声明方式配置任务数据。缺省情况下,采用<bean>标签的id作为任务名,使用缺省组作为组名,通过jobDataAsMap作为配置任务数据。 

        2)建立触发器。可以选择SimpleTriggerBean或CronTriggerBean类。SimpleTriggerBean缺省情况下把可重复执行次数设为无限。 

        3)创建schedulerFactory。缺省情况下,SchedulerFactoryBean创建一个StdSchedulerFactory的实 例,后者创建Scheduler的实现。可以通过设置schedulerFactoryClass属性来覆盖这个行为,需要继承 SchedulerFactory接口来实现你自己的版本。

    引入的jar包:

  • 相关阅读:
    题解 P3071 【[USACO13JAN]座位Seating】
    [luogu]P3398 仓鼠找sugar
    快速输入输出
    Luogu P3939 数颜色
    HEOI2016/TJOI2016 排序
    POI2011 DYN-Dynamite
    USACO17JAN Promotion Counting
    AHOI2008 聚会
    Luogu P4907 A换B problem
    网络流24题 骑士共存问题
  • 原文地址:https://www.cnblogs.com/chasewade/p/3372447.html
Copyright © 2020-2023  润新知