任务调度(Quartz Enterprise Job Scheduler)

来源:互联网 发布:安全网络龙头股 编辑:程序博客网 时间:2024/04/24 23:25

Quartz版本:2.2.1

一,可以使用crontab风格定义时间规则

任务实现类(实现Job接口):

[java] view plain copy
  1. package com.sean;  
  2.   
  3. import org.quartz.Job;  
  4. import org.quartz.JobExecutionContext;  
  5. import org.quartz.JobExecutionException;  
  6.   
  7. public class MyJob implements Job {  
  8.     public void execute(JobExecutionContext context) throws JobExecutionException {  
  9.         Task.myJobLog.info("[" + context.getJobDetail().getKey() + "]My Job!!!");  
  10.     }  
  11. }  

任务调度类:

[java] view plain copy
  1. package com.sean;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.apache.log4j.Logger;  
  6. import org.quartz.CronScheduleBuilder;  
  7. import org.quartz.CronTrigger;  
  8. import org.quartz.JobBuilder;  
  9. import org.quartz.JobDetail;  
  10. import org.quartz.Scheduler;  
  11. import org.quartz.SchedulerFactory;  
  12. import org.quartz.TriggerBuilder;  
  13. import org.quartz.impl.StdSchedulerFactory;  
  14.   
  15. public class Task {  
  16.     public static Logger myJobLog = Logger.getLogger("MyJob");  
  17.       
  18.     public static void main(String[] args){  
  19.         try{  
  20.             SchedulerFactory factory = new StdSchedulerFactory();  
  21.             Scheduler scheduler = factory.getScheduler();  
  22.               
  23.             JobDetail job = JobBuilder.newJob(MyJob.class)  
  24.                     .withIdentity("MyJob""MyGroup")  
  25.                     .build();  
  26.               
  27.             CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger()  
  28.                     .withIdentity("Trigger""MyGroup")  
  29.                     .startAt(new Date(System.currentTimeMillis()+5*1000))  
  30.                     .endAt(new Date(System.currentTimeMillis()+5*1000+60*1000))  
  31.                     .withSchedule(CronScheduleBuilder.  
  32.                             cronSchedule("0/10 * * * * ?"))  
  33.                     .build();  
  34.   
  35.             scheduler.scheduleJob(job, trigger);  
  36.             scheduler.start();  
  37.               
  38.             Thread.sleep(2*60*1000);  
  39.               
  40.             scheduler.shutdown(true);  
  41.         }catch(Exception e){  
  42.             e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  

log4j.properties:

[plain] view plain copy
  1. log4j.rootLogger=info,console    
  2. log4j.appender.console=org.apache.log4j.ConsoleAppender    
  3. log4j.appender.console.layout=org.apache.log4j.PatternLayout    
  4. log4j.appender.console.layout.ConversionPattern=%d{MM-dd HH:mm:ss}->%m%n  
  5.   
  6. log4j.logger.MyJob=info,MyJob    
  7. log4j.appender.MyJob=org.apache.log4j.RollingFileAppender     
  8. log4j.additivity.MyJob=false    
  9. log4j.appender.MyJob.File=./log/MyJob.log    
  10. log4j.appender.MyJob.MaxFileSize=10MB    
  11. log4j.appender.MyJob.MaxBackupIndex=0    
  12. log4j.appender.MyJob.layout=org.apache.log4j.PatternLayout    
  13. log4j.appender.MyJob.layout.ConversionPattern=%d{MM-dd HH:mm:ss}->%m%n    

由于使用StdSchedulerFactory(基于properties配置文件创建QuartzScheduler实例),如果在创建SchedulerFactory时没有通过new StdSchedulerFactory().initialize(props)指定特定的配置参数,也没有指定特定的配置文件,则程序使用quartz-2.2.1.jar中org\quartz下的quartz.properties作为默认的配置文件:

[plain] view plain copy
  1. org.quartz.scheduler.instanceName: DefaultQuartzScheduler  
  2. org.quartz.scheduler.rmi.export: false  
  3. org.quartz.scheduler.rmi.proxy: false  
  4. org.quartz.scheduler.wrapJobExecutionInUserTransaction: false  
  5.   
  6. org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool  
  7. org.quartz.threadPool.threadCount: 10  
  8. org.quartz.threadPool.threadPriority: 5  
  9. org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true  
  10.   
  11. org.quartz.jobStore.misfireThreshold: 60000  
  12.   
  13. org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore  

控制台显示结果:

[plain] view plain copy
  1. 08-07 14:28:06->Using default implementation for ThreadExecutor  
  2. 08-07 14:28:06->Job execution threads will use class loader of thread: main  
  3. 08-07 14:28:06->Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl  
  4. 08-07 14:28:06->Quartz Scheduler v.2.2.1 created.  
  5. 08-07 14:28:06->RAMJobStore initialized.  
  6. 08-07 14:28:06->Scheduler meta-data: Quartz Scheduler (v2.2.1) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'  
  7.   Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.  
  8.   NOT STARTED.  
  9.   Currently in standby mode.  
  10.   Number of jobs executed: 0  
  11.   Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.  
  12.   Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.  
  13.   
  14. 08-07 14:28:06->Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'  
  15. 08-07 14:28:06->Quartz scheduler version: 2.2.1  
  16. 08-07 14:28:06->Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.  
  17. 08-07 14:30:06->Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.  
  18. 08-07 14:30:06->Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.  
  19. 08-07 14:30:06->Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.  

MyJob.log:

[plain] view plain copy
  1. 08-07 14:28:15->[MyGroup.MyJob]My Job!!!  
  2. 08-07 14:28:25->[MyGroup.MyJob]My Job!!!  
  3. 08-07 14:28:35->[MyGroup.MyJob]My Job!!!  
  4. 08-07 14:28:45->[MyGroup.MyJob]My Job!!!  
  5. 08-07 14:28:55->[MyGroup.MyJob]My Job!!!  
  6. 08-07 14:29:05->[MyGroup.MyJob]My Job!!!  
  7.     

 

二,阻止任务在某些特定时间点的运行

[java] view plain copy
  1. package com.sean;  
  2.   
  3. import java.util.Calendar;  
  4. import java.util.Date;  
  5. import java.util.GregorianCalendar;  
  6.   
  7. import org.apache.log4j.Logger;  
  8. import org.quartz.JobBuilder;  
  9. import org.quartz.JobDetail;  
  10. import org.quartz.Scheduler;  
  11. import org.quartz.SchedulerFactory;  
  12. import org.quartz.SimpleScheduleBuilder;  
  13. import org.quartz.SimpleTrigger;  
  14. import org.quartz.TriggerBuilder;  
  15. import org.quartz.impl.StdSchedulerFactory;  
  16. import org.quartz.impl.calendar.AnnualCalendar;  
  17.   
  18. public class Task {  
  19. public static Logger myJobLog = Logger.getLogger("MyJob");  
  20.       
  21.     public static void main(String[] args){  
  22.         try{  
  23.             SchedulerFactory factory = new StdSchedulerFactory();  
  24.             Scheduler scheduler = factory.getScheduler();  
  25.               
  26.             AnnualCalendar cal = new AnnualCalendar();  
  27.             //2014-8-15这一天不执行任何任务  
  28.             Calendar c = new GregorianCalendar(2014715);  
  29.             cal.setDayExcluded(c, true);  
  30.             scheduler.addCalendar("exclude", cal, falsefalse);  
  31.               
  32.             JobDetail job = JobBuilder.newJob(MyJob.class)  
  33.                     .withIdentity("MyJob""MyGroup")  
  34.                     .build();  
  35.               
  36.             SimpleTrigger trigger = TriggerBuilder.newTrigger()  
  37.                     .withIdentity("Trigger""MyGroup")  
  38.                     .startAt(new Date(System.currentTimeMillis()+5*1000))  
  39.                     .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5)  
  40.                             .repeatForever())  
  41.                     .modifiedByCalendar("exclude")  
  42.                     .build();  
  43.   
  44.             scheduler.scheduleJob(job, trigger);  
  45.             scheduler.start();  
  46.               
  47.             Thread.sleep(2*60*1000);  
  48.               
  49.             scheduler.shutdown(true);  
  50.         }catch(Exception e){  
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54. }  

可以看到日志文件MyJob.log中不会打印任何任务运行信息

 

三,支持持久化任务

DB:MySQL5.6.19

JDBC:MySQL-connector-Java-5.1.30-bin.jar

最开始使用mysql-connector-java-5.1.10.jar,Quartz在进行数据库操作时报错,后来换成Connector J 5.1.30(安装MySQL5.6.19时可选择安装)中附带的jar,运行正常

默认情况下,Quartz将任务调度信息存放在内存中(默认的JobStroe策略为RAMJobStore),这样虽然能够使性能达到最佳,但是程序一旦中途崩溃,之前的调度信息将全部丢失,任务调度将从头开始;Quartz支持持久化任务调度信息,此时即使任务中途崩溃,重启后调度信息也可以被恢复

详细的配置文件说明:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/configuration/

1,在项目src目录下增加quartz.properties文件以覆盖Quartz默认配置

[plain] view plain copy
  1. org.quartz.scheduler.instanceName: DefaultQuartzScheduler  
  2. org.quartz.scheduler.rmi.export: false  
  3. org.quartz.scheduler.rmi.proxy: false  
  4. org.quartz.scheduler.wrapJobExecutionInUserTransaction: false  
  5.   
  6. org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool  
  7. org.quartz.threadPool.threadCount: 10  
  8. org.quartz.threadPool.threadPriority: 5  
  9. org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true  
  10.   
  11. org.quartz.jobStore.misfireThreshold: 60000  
  12.   
  13. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX  
  14.   
  15. org.quartz.jobStore.dataSource = myMySQL  
  16. org.quartz.dataSource.myMySQL.driver = com.mysql.jdbc.Driver  
  17. org.quartz.dataSource.myMySQL.URL = jdbc:mysql://127.0.0.1:3306/test  
  18. org.quartz.dataSource.myMySQL.user = root  
  19. org.quartz.dataSource.myMySQL.password = 123456  
  20. org.quartz.dataSource.myMySQL.maxConnections = 10  

2,使用Quartz自带的建表脚本创建持久化任务所需的表(由于使用MySQL数据库,故使用docs\dbTables路径下的tables_mysql_innodb.sql),脚本需要修改一下,将QRTZ_FIRED_TRIGGERS表建表语句中的TYENGINEPE=InnoDB改为ENGINE=InnoDB

[sql] view plain copy
  1. #  
  2. In your Quartz properties file, you'll need to set   
  3. # org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate  
  4. #  
  5. #  
  6. By: Ron Cordell - roncordell  
  7. #  I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz   
  8. #  to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.  
  9.   
  10. DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;  
  11. DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;  
  12. DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;  
  13. DROP TABLE IF EXISTS QRTZ_LOCKS;  
  14. DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;  
  15. DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;  
  16. DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;  
  17. DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;  
  18. DROP TABLE IF EXISTS QRTZ_TRIGGERS;  
  19. DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;  
  20. DROP TABLE IF EXISTS QRTZ_CALENDARS;  
  21.   
  22. CREATE TABLE QRTZ_JOB_DETAILS(  
  23. SCHED_NAME VARCHAR(120) NOT NULL,  
  24. JOB_NAME VARCHAR(200) NOT NULL,  
  25. JOB_GROUP VARCHAR(200) NOT NULL,  
  26. DESCRIPTION VARCHAR(250) NULL,  
  27. JOB_CLASS_NAME VARCHAR(250) NOT NULL,  
  28. IS_DURABLE VARCHAR(1) NOT NULL,  
  29. IS_NONCONCURRENT VARCHAR(1) NOT NULL,  
  30. IS_UPDATE_DATA VARCHAR(1) NOT NULL,  
  31. REQUESTS_RECOVERY VARCHAR(1) NOT NULL,  
  32. JOB_DATA BLOB NULL,  
  33. PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))  
  34. ENGINE=InnoDB;  
  35.   
  36. CREATE TABLE QRTZ_TRIGGERS (  
  37. SCHED_NAME VARCHAR(120) NOT NULL,  
  38. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  39. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  40. JOB_NAME VARCHAR(200) NOT NULL,  
  41. JOB_GROUP VARCHAR(200) NOT NULL,  
  42. DESCRIPTION VARCHAR(250) NULL,  
  43. NEXT_FIRE_TIME BIGINT(13) NULL,  
  44. PREV_FIRE_TIME BIGINT(13) NULL,  
  45. PRIORITY INTEGER NULL,  
  46. TRIGGER_STATE VARCHAR(16) NOT NULL,  
  47. TRIGGER_TYPE VARCHAR(8) NOT NULL,  
  48. START_TIME BIGINT(13) NOT NULL,  
  49. END_TIME BIGINT(13) NULL,  
  50. CALENDAR_NAME VARCHAR(200) NULL,  
  51. MISFIRE_INSTR SMALLINT(2) NULL,  
  52. JOB_DATA BLOB NULL,  
  53. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  54. FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)  
  55. REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))  
  56. ENGINE=InnoDB;  
  57.   
  58. CREATE TABLE QRTZ_SIMPLE_TRIGGERS (  
  59. SCHED_NAME VARCHAR(120) NOT NULL,  
  60. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  61. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  62. REPEAT_COUNT BIGINT(7) NOT NULL,  
  63. REPEAT_INTERVAL BIGINT(12) NOT NULL,  
  64. TIMES_TRIGGERED BIGINT(10) NOT NULL,  
  65. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  66. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  
  67. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  
  68. ENGINE=InnoDB;  
  69.   
  70. CREATE TABLE QRTZ_CRON_TRIGGERS (  
  71. SCHED_NAME VARCHAR(120) NOT NULL,  
  72. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  73. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  74. CRON_EXPRESSION VARCHAR(120) NOT NULL,  
  75. TIME_ZONE_ID VARCHAR(80),  
  76. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  77. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  
  78. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  
  79. ENGINE=InnoDB;  
  80.   
  81. CREATE TABLE QRTZ_SIMPROP_TRIGGERS(            
  82. SCHED_NAME VARCHAR(120) NOT NULL,  
  83. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  84. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  85. STR_PROP_1 VARCHAR(512) NULL,  
  86. STR_PROP_2 VARCHAR(512) NULL,  
  87. STR_PROP_3 VARCHAR(512) NULL,  
  88. INT_PROP_1 INT NULL,  
  89. INT_PROP_2 INT NULL,  
  90. LONG_PROP_1 BIGINT NULL,  
  91. LONG_PROP_2 BIGINT NULL,  
  92. DEC_PROP_1 NUMERIC(13,4) NULL,  
  93. DEC_PROP_2 NUMERIC(13,4) NULL,  
  94. BOOL_PROP_1 VARCHAR(1) NULL,  
  95. BOOL_PROP_2 VARCHAR(1) NULL,  
  96. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  97. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)   
  98. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  
  99. ENGINE=InnoDB;  
  100.   
  101. CREATE TABLE QRTZ_BLOB_TRIGGERS (  
  102. SCHED_NAME VARCHAR(120) NOT NULL,  
  103. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  104. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  105. BLOB_DATA BLOB NULL,  
  106. PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  
  107. INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),  
  108. FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  
  109. REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  
  110. ENGINE=InnoDB;  
  111.   
  112. CREATE TABLE QRTZ_CALENDARS (  
  113. SCHED_NAME VARCHAR(120) NOT NULL,  
  114. CALENDAR_NAME VARCHAR(200) NOT NULL,  
  115. CALENDAR BLOB NOT NULL,  
  116. PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))  
  117. ENGINE=InnoDB;  
  118.   
  119. CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (  
  120. SCHED_NAME VARCHAR(120) NOT NULL,  
  121. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  122. PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))  
  123. ENGINE=InnoDB;  
  124.   
  125. CREATE TABLE QRTZ_FIRED_TRIGGERS (  
  126. SCHED_NAME VARCHAR(120) NOT NULL,  
  127. ENTRY_ID VARCHAR(95) NOT NULL,  
  128. TRIGGER_NAME VARCHAR(200) NOT NULL,  
  129. TRIGGER_GROUP VARCHAR(200) NOT NULL,  
  130. INSTANCE_NAME VARCHAR(200) NOT NULL,  
  131. FIRED_TIME BIGINT(13) NOT NULL,  
  132. SCHED_TIME BIGINT(13) NOT NULL,  
  133. PRIORITY INTEGER NOT NULL,  
  134. STATE VARCHAR(16) NOT NULL,  
  135. JOB_NAME VARCHAR(200) NULL,  
  136. JOB_GROUP VARCHAR(200) NULL,  
  137. IS_NONCONCURRENT VARCHAR(1) NULL,  
  138. REQUESTS_RECOVERY VARCHAR(1) NULL,  
  139. PRIMARY KEY (SCHED_NAME,ENTRY_ID))  
  140. ENGINE=InnoDB;  
  141.   
  142. CREATE TABLE QRTZ_SCHEDULER_STATE (  
  143. SCHED_NAME VARCHAR(120) NOT NULL,  
  144. INSTANCE_NAME VARCHAR(200) NOT NULL,  
  145. LAST_CHECKIN_TIME BIGINT(13) NOT NULL,  
  146. CHECKIN_INTERVAL BIGINT(13) NOT NULL,  
  147. PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))  
  148. ENGINE=InnoDB;  
  149.   
  150. CREATE TABLE QRTZ_LOCKS (  
  151. SCHED_NAME VARCHAR(120) NOT NULL,  
  152. LOCK_NAME VARCHAR(40) NOT NULL,  
  153. PRIMARY KEY (SCHED_NAME,LOCK_NAME))  
  154. ENGINE=InnoDB;  
  155.   
  156. CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);  
  157. CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);  
  158.   
  159. CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);  
  160. CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);  
  161. CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);  
  162. CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);  
  163. CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);  
  164. CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);  
  165. CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);  
  166. CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);  
  167. CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);  
  168. CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);  
  169. CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);  
  170. CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS  
  171. (SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);  
  172.   
  173. CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);  
  174. CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);  
  175. CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);  
  176. CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);  
  177. CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);  
  178. CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);  
  179.   
  180. commit;   

3,修改调度逻辑,运行时首先检查是否存在没有执行完的任务,如果存在,则继续之前未完成的任务

[java] view plain copy
  1. package com.sean;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.apache.log4j.Logger;  
  6. import org.quartz.JobBuilder;  
  7. import org.quartz.JobDetail;  
  8. import org.quartz.JobKey;  
  9. import org.quartz.Scheduler;  
  10. import org.quartz.SchedulerFactory;  
  11. import org.quartz.SimpleScheduleBuilder;  
  12. import org.quartz.SimpleTrigger;  
  13. import org.quartz.Trigger;  
  14. import org.quartz.TriggerBuilder;  
  15. import org.quartz.TriggerKey;  
  16. import org.quartz.impl.StdSchedulerFactory;  
  17.   
  18. public class Task {  
  19.     public static Logger myJobLog = Logger.getLogger("MyJob");  
  20.       
  21.     public static void main(String[] args){  
  22.         try{  
  23.             SchedulerFactory factory = new StdSchedulerFactory();  
  24.             Scheduler scheduler = factory.getScheduler();  
  25.               
  26.             TriggerKey tKey = new TriggerKey("MyTrigger""Group");  
  27.             JobKey jKey = new JobKey("MyJob""Group");  
  28.               
  29.             if(scheduler.checkExists(tKey)){  
  30.                 Trigger trigger = scheduler.getTrigger(tKey);  
  31.                 scheduler.rescheduleJob(tKey, trigger);  
  32.             }else{  
  33.                 JobDetail job = JobBuilder.newJob(MyJob.class)  
  34.                         .withIdentity(jKey)  
  35.                         .build();  
  36.                   
  37.                 SimpleTrigger trigger = TriggerBuilder.newTrigger()  
  38.                         .withIdentity(tKey)  
  39.                         .startAt(new Date(System.currentTimeMillis()+5*1000))  
  40.                         .withSchedule(SimpleScheduleBuilder.simpleSchedule()  
  41.                         .withIntervalInSeconds(10).withRepeatCount(10))  
  42.                         .build();  
  43.       
  44.                 scheduler.scheduleJob(job, trigger);  
  45.             }  
  46.             scheduler.start();  
  47.             Thread.sleep(2*60*1000);  
  48.             scheduler.shutdown(true);  
  49.         }catch(Exception e){  
  50.             e.printStackTrace();  
  51.         }  
  52.     }  
  53. }  

首先运行一段时间(任务执行了2次)

然后关闭程序一点时间后,再次运行程序(当前的REPEAT_COUNT = 之前的REPEAT_COUNT - 之前的TIMES_TRIGGERED):

任务日志如下:

[plain] view plain copy
  1. 08-12 15:05:36->[Group.MyJob]My Job!!!  
  2. 08-12 15:05:46->[Group.MyJob]My Job!!!  
  3. 08-12 15:06:39->[Group.MyJob]My Job!!!  
  4. 08-12 15:06:49->[Group.MyJob]My Job!!!  
  5. 08-12 15:06:59->[Group.MyJob]My Job!!!  
  6. 08-12 15:07:10->[Group.MyJob]My Job!!!  
  7. 08-12 15:07:19->[Group.MyJob]My Job!!!  
  8. 08-12 15:07:29->[Group.MyJob]My Job!!!  
  9. 08-12 15:07:39->[Group.MyJob]My Job!!!  
  10. 08-12 15:07:49->[Group.MyJob]My Job!!!  
  11. 08-12 15:07:59->[Group.MyJob]My Job!!!  

 

待解决的问题

1,设置任务重复10次,但是根据任务日志,任务实际执行了11次。第十次时,数据库中的REPEAT_COUNT为10,TIMES_TRIGGERED也为10(在没有中断恢复的情况下),之后表中的调度信息被清空,日志中打印出任务第11次执行的结果

2,关闭程序后等待一段时间(具体是多长时间不确定),再次执行程序,Quartz将表现出上面提到的恢复过程,但是如果关闭程序后立马再次执行程序,任务调度将变得混乱,同一时刻将一下子运行多次任务,不清楚是什么情况,日志如下:

[plain] view plain copy
  1. 08-12 16:10:47->[DefaultQuartzScheduler_Worker-1][Group.MyJob]My Job!!!  
  2. 08-12 16:10:57->[DefaultQuartzScheduler_Worker-2][Group.MyJob]My Job!!!  
  3. 08-12 16:11:11->[DefaultQuartzScheduler_Worker-1][Group.MyJob]My Job!!!  
  4. 08-12 16:11:11->[DefaultQuartzScheduler_Worker-2][Group.MyJob]My Job!!!  
  5. 08-12 16:11:11->[DefaultQuartzScheduler_Worker-3][Group.MyJob]My Job!!!  
  6. 08-12 16:11:17->[DefaultQuartzScheduler_Worker-4][Group.MyJob]My Job!!!  
  7. 08-12 16:11:27->[DefaultQuartzScheduler_Worker-5][Group.MyJob]My Job!!!  
  8. 08-12 16:11:37->[DefaultQuartzScheduler_Worker-6][Group.MyJob]My Job!!!  
  9. 08-12 16:11:47->[DefaultQuartzScheduler_Worker-7][Group.MyJob]My Job!!!  
  10. 08-12 16:11:57->[DefaultQuartzScheduler_Worker-8][Group.MyJob]My Job!!!  
  11. 08-12 16:12:07->[DefaultQuartzScheduler_Worker-9][Group.MyJob]My Job!!!  

将配置文件中的线程数改为1也不行,不清楚哪里有问题

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2岁宝宝断奶哭闹怎么办 脑子感觉变笨了怎么办 5岁数学不开窍怎么办 小孩拼音太差了怎么办 我生了爸爸孩子怎么办 三岁宝宝特别犟怎么办 孩子说老师打他怎么办 孩子在幼儿园不合群怎么办 孩与厌学不想学怎么办 1岁宝宝太活泼怎么办 3岁宝宝不爱看书怎么办 6岁不好好吃饭怎么办 二岁宝宝不吃饭怎么办 2岁半宝宝不爱吃饭怎么办 宝宝一岁了不爱吃饭怎么办 一岁多的宝宝不爱吃饭怎么办 小孩不吃饭还吐怎么办 一岁婴儿不吃饭怎么办 写字久了肩膀疼怎么办 6岁儿童不写字怎么办 孩子字写得丑怎么办 6岁儿童怕写字怎么办 高三学生上课困怎么办 高三学生压力大怎么办 数学会做的做错怎么办 脑子很笨反应慢怎么办 好学生考砸了怎么办 孩子写作业范愁怎么办 对粗心的孩子该怎么办 做计算题总出错怎么办 孩子字写得不好怎么办 3岁宝宝数学不好怎么办 十个月的宝宝拉肚子怎么办 刚生的宝宝拉肚子怎么办 我给兔子洗澡了怎么办 刚生的小狗脐带怎么办 宠物兔不想养了怎么办 兔子被打不动了怎么办 ai画板大小会变怎么办 和小孩生肖相冲怎么办 小孩和父母相冲怎么办