Quartz

博客分类: 第三方依赖

一、各种企业几乎都会碰到任务调度需求,就拿论坛来说,每个半个小时生成精华文章的RRS文件,每天凌晨统计用户的积分排名,没个30分钟执行锁定任务解锁任务。和 现今许多在用的开源项目一样,Quartz之初也只是为个人开发者提供了一个简单的实现方案。但是随着日益增多的关键人员的积极参与和慷慨的贡 献,Quartz 已经成为了一个为众人所知,并且能帮助人们解决更大问题的框架。 Quartz 项目 是由 James House 创立的,它在1998年就有该框架最初的构思。包括作业队列的概念,使用线程池来处理作业,也许它最早的模型已不为现今的Quartz使用者所知了。 下载地址http://www.quartz-scheduler.org/

二、Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器、任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念进行描述:

1、Job :是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在 JobDataMap实例中;

2、JobDetail :Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接受一个Job的实例,相反它接收一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。因此需要通过一个类来描述Job的实现类及其它相关的静态信息 ,如Job名字、描述、关联监听器等信息,JobDetail承担了这一角色。通过该类的构造函数可以更具体地了解它的功用:JobDetail(java.lang.String name, java.lang.String group, java.lang.Class jobClass),该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称;

3、Trigger :是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和 CronTrigger这两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则 可以通过Cron表达式定义出各种复杂时间规则的调度方案:如每早晨9:00执行,周一、周三、周五下午5:00执行等;

4、Calendar :org.quartz.Calendar和java.util.Calendar不同,它是一些日历 特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合—— java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。一个 Trigger可以和多个Calendar关联,以便排除或包含某些时间点。假设,我们安排每周星期一早上10:00执行任务,但是如果碰到法定的节日,任务则不执行,这时就需要在Trigger触 发机制的基础上使用Calendar进行定点排除。针对不同时间段类型,Quartz在org.quartz.impl.calendar包下提供了若干 个Calendar的实现类,如AnnualCalendar、MonthlyCalendar、WeeklyCalendar分别针对每年、每月和每周 进行定义;

5、Scheduler :代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到 Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组 及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多 个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job 可 以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,它类似于 ServletContext,保存着Scheduler上下文信息,Job和Trigger都可以访问SchedulerContext内的信息。 SchedulerContext内部通过一个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个 put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应SchedulerContext实例。

三、下面就举例说明,要加入的包:

Xml代码   收藏代码
  1. < dependency >   
  2.     < groupId > org.quartz-scheduler </ groupId >   
  3.     < artifactId > quartz </ artifactId >   
  4.     < version > 1.8.5 </ version >   
  5. </ dependency >   
Java代码   收藏代码
  1. package  com.yt.manager.quartz;  
  2.   
  3. import  java.util.Date;  
  4. import  org.quartz.Job;  
  5. import  org.quartz.JobExecutionContext;  
  6. import  org.quartz.JobExecutionException;  
  7.   
  8. /**  
  9.  * @Description: 该类是定时任务具体执行的类,实现Job接口  
  10.  * @ClassName: SayHelloWorldJob  
  11.  * @Project: base-info  
  12.  * @Author: zxf  
  13.  * @Date: 2011-8-22  
  14.  */   
  15. public   class  SimpleJob  implements  Job {  
  16.   
  17.     @Override   
  18.     public   void  execute(JobExecutionContext context)  
  19.             throws  JobExecutionException {  
  20.         System.out.println(context.getTrigger().getName()  
  21.                 + " triggered. time is:"  + ( new  Date()));  
  22.     }  
  23. }  
 

 (1)、使用简单的simpleTrigger

Java代码   收藏代码
  1. package  com.yt.manager.quartz;  
  2.   
  3. import  java.util.Date;  
  4. import  org.quartz.JobDetail;  
  5. import  org.quartz.Scheduler;  
  6. import  org.quartz.SchedulerFactory;  
  7. import  org.quartz.SimpleTrigger;  
  8. import  org.quartz.impl.StdSchedulerFactory;  
  9.   
  10. /**  
  11.  * @Description: 使用simpleTrigger  
  12.  * @ClassName: SimpleTriggerRunner  
  13.  * @Project: base-info  
  14.  * @Author: zxf  
  15.  * @Date: 2011-8-22  
  16.  */   
  17. public   class  SimpleTriggerRunner {  
  18.   
  19.     public   static   void  main(String args[]) {  
  20.   
  21.         try  {  
  22.   
  23.             // ①创建一个JobDetail实例,指定SimpleJob   
  24.             JobDetail jobDetail = new  JobDetail( "job1_1""jGroup1" ,  
  25.                     SimpleJob.class );  
  26.   
  27.             // ②通过SimpleTrigger定义调度规则:马上启动,每2秒运行一次,共运行100次   
  28.             SimpleTrigger simpleTrigger = new  SimpleTrigger( "trigger1_1" ,  
  29.                     "tgroup1" );  
  30.             simpleTrigger.setStartTime(new  Date());  
  31.             simpleTrigger.setRepeatInterval(2000 );  
  32.             simpleTrigger.setRepeatCount(100 );  
  33.   
  34.             // ③通过SchedulerFactory获取一个调度器实例   
  35.             SchedulerFactory schedulerFactory = new  StdSchedulerFactory();  
  36.             Scheduler scheduler = schedulerFactory.getScheduler();  
  37.             // ④ 注册并进行调度   
  38.             scheduler.scheduleJob(jobDetail, simpleTrigger);  
  39.   
  40.             // ⑤调度启动   
  41.             scheduler.start();  
  42.   
  43.         } catch  (Exception e) {  
  44.   
  45.             e.printStackTrace();  
  46.   
  47.         }  
  48.   
  49.     }  
  50. }  

  (2)、CronTrigger 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式,CronTrigger 支持日历相关的重复时间间隔(比如每月第一个周一执行),而不是简单的周期时间间隔。因此,相对于SimpleTrigger而 言,CronTrigger在使用上也要复杂一些。

Java代码   收藏代码
  1. package  com.yt.manager.quartz;  
  2.   
  3. import  org.quartz.CronExpression;  
  4. import  org.quartz.CronTrigger;  
  5. import  org.quartz.JobDetail;  
  6. import  org.quartz.Scheduler;  
  7. import  org.quartz.SchedulerException;  
  8. import  org.quartz.SchedulerFactory;  
  9. import  org.quartz.Trigger;  
  10. import  org.quartz.impl.StdSchedulerFactory;  
  11. import  org.springframework.stereotype.Component;  
  12.   
  13. /**  
  14.  * 使用CronTrigger  
  15.  * @Description:   
  16.  * @ClassName: CronTriggerRunner  
  17.  * @Project: quartz  
  18.  * @Author: zxf  
  19.  * @Date: 2011-8-23  
  20.  */   
  21. @Component ( "cronTriggerRunner" )  
  22. public   class  CronTriggerRunner {  
  23.   
  24.     SchedulerFactory schedulerFactory = new  StdSchedulerFactory();  
  25.     private   static   final  String TRIGGER_GROUP_NAME =  "tgroup" ;  
  26.     private   static   final  String JOB_GROUP_NAME =  "jGroup" ;  
  27.   
  28.     /**  
  29.      * 创建触发器  
  30.      * @param express 时间规则  
  31.      * @param triggerName 触发器名称  
  32.      * @return  
  33.      */   
  34.     public  CronTrigger createTrigger(String triggerName,String express){  
  35.         CronTrigger cronTrigger = null ;  
  36.         try  {  
  37.             cronTrigger = new  CronTrigger(triggerName, TRIGGER_GROUP_NAME);    
  38.             CronExpression cexp = null ;  
  39.             cexp = new  CronExpression(express);  
  40.             cronTrigger.setCronExpression(cexp);   
  41.         }catch (Exception e){  
  42.             e.printStackTrace();  
  43.         }  
  44.         return  cronTrigger;  
  45.     }  
  46.   
  47.     /**  
  48.      * 创建一个定时任务  
  49.      * @param quartzName 任务名称  
  50.      */   
  51.     public   void  createQuartz(String quartzName) {  
  52.         try  {  
  53.             JobDetail jobDetail = new  JobDetail(quartzName, JOB_GROUP_NAME,  
  54.                     SimpleJob.class );  
  55.             Scheduler scheduler = schedulerFactory.getScheduler();  
  56.             scheduler.scheduleJob(jobDetail, this .createTrigger(quartzName+ "_trigger" , "0/2 * * * * ?" ));  
  57.             scheduler.start();  
  58.         } catch  (Exception e) {  
  59.             e.printStackTrace();  
  60.         }  
  61.     }  
  62.   
  63.     /**  
  64.      * 移除一个定时任务  
  65.      * @param quartzName 任务名称  
  66.      */   
  67.     public   void  removeQuartz(String quartzName) {  
  68.         try  {  
  69.             Scheduler scheduler = schedulerFactory.getScheduler();  
  70.             scheduler.pauseTrigger(quartzName+"_trigger" , TRIGGER_GROUP_NAME); // 停止触发器   
  71.             scheduler.unscheduleJob(quartzName+"_trigger" , TRIGGER_GROUP_NAME); // 移除触发器   
  72.             scheduler.deleteJob(quartzName, JOB_GROUP_NAME);// 删除任务   
  73.         } catch  (Exception e) {  
  74.             e.printStackTrace();  
  75.         }  
  76.     }  
  77.   
  78.     /**  
  79.      * 恢复任务  
  80.      * @throws SchedulerException  
  81.      */   
  82.     public   void  task()  throws  SchedulerException {  
  83.   
  84.         Scheduler scheduler = schedulerFactory.getScheduler();  
  85.   
  86.         String[] triggerGroups;  
  87.         String[] triggers;  
  88.   
  89.         triggerGroups = scheduler.getTriggerGroupNames();  
  90.         for  ( int  i =  0 ; i < triggerGroups.length; i++) {  
  91.             triggers = scheduler.getTriggerNames(triggerGroups[i]);  
  92.             for  ( int  j =  0 ; j < triggers.length; j++) {  
  93.                 Trigger tg = scheduler.getTrigger(triggers[j], triggerGroups[i]);  
  94.                 //重新安排任务   
  95.                 scheduler.rescheduleJob(triggers[j], triggerGroups[i], tg);  
  96.             }  
  97.         }  
  98.         // start the scheduler   
  99.         scheduler.start();  
  100.     }  
  101.   
  102.     public   static   void  main(String args[]) {  
  103.         CronTriggerRunner r = new  CronTriggerRunner();  
  104.         r.createQuartz("001" );  
  105.     }  
  106. }  
 
Cron表达式

Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示:

1 Cron表达式时间字段

 

位置

时间域名

允许值

允许的特殊字符

1

0-59

, - * /

2

分钟

0-59

, - * /

3

小时

0-23

, - * /

4

日期

1-31

, - * ? / L W C

5

月份

1-12

, - * /

6

星期

1-7

, - * ? / L C #

7

年(可选)

空值1970-2099

, - * /

Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:

●星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;

●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;

●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;

●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;

●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;

●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月 份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值 X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;

●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工 作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意 关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期 范围;

●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;

●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;

● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

表2下面给出一些完整的Cron表示式的实例:

2 Cron表示式示例

表示式

说明

"0 0 12 * * ? "

每天12点运行

"0 15 10 ? * *"

每天10:15运行

"0 15 10 * * ?"

每天10:15运行

"0 15 10 * * ? *"

每天10:15运行

"0 15 10 * * ? 2008"

在2008年的每天10:15运行

"0 * 14 * * ?"

每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。

"0 0/5 14 * * ?"

每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。

"0 0/5 14,18 * * ?"

每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。

"0 0-5 14 * * ?"

每天14:00点到14:05,每分钟运行一次。

"0 10,44 14 ? 3 WED"

3月每周三的14:10分到14:44,每分钟运行一次。

"0 15 10 ? * MON-FRI"

每周一,二,三,四,五的10:15分运行。

"0 15 10 15 * ?"

每月15日10:15分运行。

"0 15 10 L * ?"

每月最后一天10:15分运行。

"0 15 10 ? * 6L"

每月最后一个星期五10:15分运行。

"0 15 10 ? * 6L 2007-2009"

在2007,2008,2009年每个月的最后一个星期五的10:15分运行。

"0 15 10 ? * 6#3"

每月第三个星期五的10:15分运行。

 

四、任务的持久化

1、到quartz-1.8.5\docs\dbTables找到对应的数据库导入

2、加入quartz.properties资源文件配置数据源

Properties代码   收藏代码
  1. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool  
  2. org.quartz.threadPool.threadCount = 10   
  3. org.quartz.threadPool.threadPriority = 5   
  4. org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true  
  5.   
  6. # Using RAMJobStore  
  7. ## if using RAMJobStore, please be sure that you comment out the following  
  8. ## - org.quartz.jobStore.tablePrefix,   
  9. ## - org.quartz.jobStore.driverDelegateClass,   
  10. ## - org.quartz.jobStore.dataSource  
  11. #org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore  
  12.   
  13. # Using JobStoreTX  
  14. ## Be sure to run the appropriate script(under docs/dbTables) first to create tables  
  15. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
  16.   
  17. # Configuring JDBCJobStore with the Table Prefix  
  18. org.quartz.jobStore.tablePrefix = QRTZ_  
  19.   
  20. # Using DriverDelegate  
  21. org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate  
  22.   
  23. # Using datasource  
  24. org.quartz.jobStore.dataSource = myDS  
  25.   
  26. # Define the datasource to use  
  27. org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver  
  28. org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@127.0 . 0.1 : 1521 :orcl  
  29. org.quartz.dataSource.myDS.user = oracle_test1  
  30. org.quartz.dataSource.myDS.password = zhouxufeng  
  31. org.quartz.dataSource.myDS.maxConnections = 30      

五、spring整合Quartz

Xml代码   收藏代码
  1. <? xml   version = "1.0"   encoding = "UTF-8" ?>   
  2. < beans   xmlns = "http://www.springframework.org/schema/beans"   
  3.     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:p = "http://www.springframework.org/schema/p"   
  5.     xsi:schemaLocation ="http://www.springframework.org/schema/beans   
  6.     http://www.springframework.org/schema/beans/spring-beans.xsd">   
  7.   
  8.     <!-- 通过JobDetailBean实现jobDetail -->   
  9.     < bean   name = "jobDetail"   
  10.         class = "org.springframework.scheduling.quartz.JobDetailBean" >   
  11.         < property   name = "jobClass"   value = "com.yt.manager.quartzspring.MyJob"   />   
  12.         <!--传递的参数 -->   
  13.         < property   name = "jobDataAsMap" >   
  14.             < map >   
  15.                 < entry   key = "size"   value = "10"   />   
  16.             </ map >   
  17.         </ property >   
  18.         <!--可以在MyJob中获取applicationContext信息-->   
  19.         < property   name = "applicationContextJobDataKey"   
  20.             value = "applicationContext"   />   
  21.     </ bean >      
  22.       
  23.     <!-- 通过封装服务类方法实现jobDetail -->   
  24.     < bean   id = "jobDetail_1"   
  25.         class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >   
  26.         < property   name = "targetObject"   ref = "quartzService"   />   
  27.         < property   name = "targetMethod"   value = "work"   />   
  28.     </ bean >   
  29.       
  30.     < bean   id = "quartzService"   class = "com.yt.manager.quartzspring.QuartzServiceImpl" > </ bean >   
  31.       
  32.     <!--创建simpleTrigger触发器-->   
  33.     < bean   id = "simpleTrigger"   
  34.         class = "org.springframework.scheduling.quartz.SimpleTriggerBean" >   
  35.         < property   name = "jobDetail"   ref = "jobDetail"   />   
  36.         < property   name = "startDelay"   value = "1000"   />   
  37.         < property   name = "repeatInterval"   value = "2000"   />   
  38.         < property   name = "repeatCount"   value = "100"   />   
  39.         <!--传递的参数 -->   
  40.         < property   name = "jobDataAsMap" >   
  41.             < map >   
  42.                 < entry   key = "count"   value = "10"   />   
  43.             </ map >   
  44.         </ property >   
  45.     </ bean >   
  46.       
  47.     <!--创建CronTrigger触发器  -->   
  48.     < bean   id  = "cronTrigger"    class  = "org.springframework.scheduling.quartz.CronTriggerBean"   >   
  49.         < property    name  = "jobDetail"   >   
  50.             < ref    bean  = "jobDetail_1"   />   
  51.         </ property   >   
  52.         <!--  cron表达式  -->   
  53.         < property    name  = "cronExpression"   >   
  54.             < value >  0/2 * * * * ?  </ value   >   
  55.         </ property   >   
  56.     </ bean   >   
  57.       
  58.     <!--  总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序   -->   
  59.     < bean   id = "scheduler"    
  60.         class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" >   
  61.         < property   name = "triggers" >   
  62.             < list >   
  63.                 < ref   bean = "simpleTrigger"   />   
  64.                 < ref   bean = "cronTrigger"   />   
  65.             </ list >   
  66.         </ property >   
  67.         < property   name = "schedulerContextAsMap" >   
  68.             < map >   
  69.                 < entry   key = "timeout"   value = "30"   />   
  70.             </ map >   
  71.         </ property >   
  72.         < property   name = "quartzProperties" >   
  73.             < props >   
  74.                 < prop   key = "org.quartz.threadPool.class" >   
  75.                     org.quartz.simpl.SimpleThreadPool  
  76.                 </ prop >   
  77.                 < prop   key = "org.quartz.threadPool.threadCount" > 10 </ prop >   
  78.             </ props >   
  79.         </ property >   
  80.     </ bean >   
  81.       
  82. </ beans >   
Java代码   收藏代码
  1. package  com.yt.manager.quartzspring;  
  2.   
  3. public   class  QuartzServiceImpl {  
  4.   
  5.     public   void  work() {  
  6.         System.out.println(" Quartz的任务调度!!! " );  
  7.     }  
  8. }  
Java代码   收藏代码
  1. package  com.yt.manager.quartzspring;  
  2.   
  3. import  java.util.Map;  
  4. import  org.quartz.JobExecutionContext;  
  5. import  org.quartz.JobExecutionException;  
  6. import  org.quartz.StatefulJob;  
  7. import  org.springframework.context.ApplicationContext;  
  8.   
  9. public   class  MyJob  implements  StatefulJob {  
  10.     public   void  execute(JobExecutionContext jctx)  throws  JobExecutionException {  
  11.         //获取JobDetail属性   
  12.         Map dataMap = jctx.getJobDetail().getJobDataMap();  
  13.         //获取Trigger属性   
  14.     //  Map dataMap = jctx.getTrigger().getJobDataMap();   
  15.         String size =(String)dataMap.get("size" );  
  16.         //获取applicationContext信息   
  17.         ApplicationContext ctx = (ApplicationContext)dataMap.get("applicationContext" );  
  18.         System.out.println("size:" +size);  
  19.           
  20.         String count =(String)dataMap.get("count" );  
  21.         System.out.println("count:" +count);  
  22.     }  
  23. }  
Java代码   收藏代码
  1. package  com.yt.manager.quartzspring;  
  2.   
  3. import  org.springframework.context.ApplicationContext;  
  4. import  org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. /**  
  7.  * @Description:测试类  
  8.  * @ClassName: MainTest  
  9.  * @Project: quartz  
  10.  * @Author: zxf  
  11.  * @Date: 2011-8-23  
  12.  */   
  13. public   class  Test {  
  14.   
  15.     /**  
  16.      * @param args  
  17.      */   
  18.     public   static   void  main(String[] args) {  
  19.         System.out.println(" Test start . " );  
  20.         ApplicationContext context = new  ClassPathXmlApplicationContext(  
  21.                 "quartz-config.xml" );  
  22.         // 如果配置文件中将scheduler bean的lazy-init设置为false 则不用实例化   
  23.         context.getBean("scheduler" );  
  24.         System.out.print(" Test end .. " );  
  25.   
  26.     }  
  27.   
  28. }  

 小结:

Quartz提供了最为丰富的任务调度功能,不但可以制定周期性运行的任务调度方案,还可以让你按照日历相关的方式进行任务调度。Quartz框架 的重要组件包括Job、JobDetail、Trigger、Scheduler以及辅助性的JobDataMap和SchedulerContext。

Quartz拥有一个线程池,通过线程池为任务提供执行线程,你可以通过配置文件对线程池进行参数定制。Quartz的另 一个重要功能是可将任务调度信息持久化到数据库中,以便系统重启时能够恢复已经安排的任务。此外,Quartz还拥有完善的事件体系,允许你注册各种事件 的监听器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值