任务调度(Quartz Enterprise Job Scheduler)
来源:互联网 发布:安全网络龙头股 编辑:程序博客网 时间:2024/04/24 23:25
Quartz版本:2.2.1
一,可以使用crontab风格定义时间规则
任务实现类(实现Job接口):
- package com.sean;
- import org.quartz.Job;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- public class MyJob implements Job {
- public void execute(JobExecutionContext context) throws JobExecutionException {
- Task.myJobLog.info("[" + context.getJobDetail().getKey() + "]My Job!!!");
- }
- }
任务调度类:
- package com.sean;
- import java.util.Date;
- import org.apache.log4j.Logger;
- import org.quartz.CronScheduleBuilder;
- import org.quartz.CronTrigger;
- import org.quartz.JobBuilder;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerFactory;
- import org.quartz.TriggerBuilder;
- import org.quartz.impl.StdSchedulerFactory;
- public class Task {
- public static Logger myJobLog = Logger.getLogger("MyJob");
- public static void main(String[] args){
- try{
- SchedulerFactory factory = new StdSchedulerFactory();
- Scheduler scheduler = factory.getScheduler();
- JobDetail job = JobBuilder.newJob(MyJob.class)
- .withIdentity("MyJob", "MyGroup")
- .build();
- CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger()
- .withIdentity("Trigger", "MyGroup")
- .startAt(new Date(System.currentTimeMillis()+5*1000))
- .endAt(new Date(System.currentTimeMillis()+5*1000+60*1000))
- .withSchedule(CronScheduleBuilder.
- cronSchedule("0/10 * * * * ?"))
- .build();
- scheduler.scheduleJob(job, trigger);
- scheduler.start();
- Thread.sleep(2*60*1000);
- scheduler.shutdown(true);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
log4j.properties:
- log4j.rootLogger=info,console
- log4j.appender.console=org.apache.log4j.ConsoleAppender
- log4j.appender.console.layout=org.apache.log4j.PatternLayout
- log4j.appender.console.layout.ConversionPattern=%d{MM-dd HH:mm:ss}->%m%n
- log4j.logger.MyJob=info,MyJob
- log4j.appender.MyJob=org.apache.log4j.RollingFileAppender
- log4j.additivity.MyJob=false
- log4j.appender.MyJob.File=./log/MyJob.log
- log4j.appender.MyJob.MaxFileSize=10MB
- log4j.appender.MyJob.MaxBackupIndex=0
- log4j.appender.MyJob.layout=org.apache.log4j.PatternLayout
- 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作为默认的配置文件:
- org.quartz.scheduler.instanceName: DefaultQuartzScheduler
- org.quartz.scheduler.rmi.export: false
- org.quartz.scheduler.rmi.proxy: false
- org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
- org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
- org.quartz.threadPool.threadCount: 10
- org.quartz.threadPool.threadPriority: 5
- org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
- org.quartz.jobStore.misfireThreshold: 60000
- org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
控制台显示结果:
- 08-07 14:28:06->Using default implementation for ThreadExecutor
- 08-07 14:28:06->Job execution threads will use class loader of thread: main
- 08-07 14:28:06->Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
- 08-07 14:28:06->Quartz Scheduler v.2.2.1 created.
- 08-07 14:28:06->RAMJobStore initialized.
- 08-07 14:28:06->Scheduler meta-data: Quartz Scheduler (v2.2.1) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
- Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
- NOT STARTED.
- Currently in standby mode.
- Number of jobs executed: 0
- Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
- Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
- 08-07 14:28:06->Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
- 08-07 14:28:06->Quartz scheduler version: 2.2.1
- 08-07 14:28:06->Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
- 08-07 14:30:06->Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
- 08-07 14:30:06->Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
- 08-07 14:30:06->Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
MyJob.log:
- 08-07 14:28:15->[MyGroup.MyJob]My Job!!!
- 08-07 14:28:25->[MyGroup.MyJob]My Job!!!
- 08-07 14:28:35->[MyGroup.MyJob]My Job!!!
- 08-07 14:28:45->[MyGroup.MyJob]My Job!!!
- 08-07 14:28:55->[MyGroup.MyJob]My Job!!!
- 08-07 14:29:05->[MyGroup.MyJob]My Job!!!
二,阻止任务在某些特定时间点的运行
- package com.sean;
- import java.util.Calendar;
- import java.util.Date;
- import java.util.GregorianCalendar;
- import org.apache.log4j.Logger;
- import org.quartz.JobBuilder;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerFactory;
- import org.quartz.SimpleScheduleBuilder;
- import org.quartz.SimpleTrigger;
- import org.quartz.TriggerBuilder;
- import org.quartz.impl.StdSchedulerFactory;
- import org.quartz.impl.calendar.AnnualCalendar;
- public class Task {
- public static Logger myJobLog = Logger.getLogger("MyJob");
- public static void main(String[] args){
- try{
- SchedulerFactory factory = new StdSchedulerFactory();
- Scheduler scheduler = factory.getScheduler();
- AnnualCalendar cal = new AnnualCalendar();
- //2014-8-15这一天不执行任何任务
- Calendar c = new GregorianCalendar(2014, 7, 15);
- cal.setDayExcluded(c, true);
- scheduler.addCalendar("exclude", cal, false, false);
- JobDetail job = JobBuilder.newJob(MyJob.class)
- .withIdentity("MyJob", "MyGroup")
- .build();
- SimpleTrigger trigger = TriggerBuilder.newTrigger()
- .withIdentity("Trigger", "MyGroup")
- .startAt(new Date(System.currentTimeMillis()+5*1000))
- .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5)
- .repeatForever())
- .modifiedByCalendar("exclude")
- .build();
- scheduler.scheduleJob(job, trigger);
- scheduler.start();
- Thread.sleep(2*60*1000);
- scheduler.shutdown(true);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
可以看到日志文件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默认配置
- org.quartz.scheduler.instanceName: DefaultQuartzScheduler
- org.quartz.scheduler.rmi.export: false
- org.quartz.scheduler.rmi.proxy: false
- org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
- org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
- org.quartz.threadPool.threadCount: 10
- org.quartz.threadPool.threadPriority: 5
- org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
- org.quartz.jobStore.misfireThreshold: 60000
- org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
- org.quartz.jobStore.dataSource = myMySQL
- org.quartz.dataSource.myMySQL.driver = com.mysql.jdbc.Driver
- org.quartz.dataSource.myMySQL.URL = jdbc:mysql://127.0.0.1:3306/test
- org.quartz.dataSource.myMySQL.user = root
- org.quartz.dataSource.myMySQL.password = 123456
- org.quartz.dataSource.myMySQL.maxConnections = 10
2,使用Quartz自带的建表脚本创建持久化任务所需的表(由于使用MySQL数据库,故使用docs\dbTables路径下的tables_mysql_innodb.sql),脚本需要修改一下,将QRTZ_FIRED_TRIGGERS表建表语句中的TYENGINEPE=InnoDB改为ENGINE=InnoDB
- #
- # In your Quartz properties file, you'll need to set
- # org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
- #
- #
- # By: Ron Cordell - roncordell
- # I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz
- # to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.
- DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
- DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
- DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
- DROP TABLE IF EXISTS QRTZ_LOCKS;
- DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
- DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
- DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
- DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
- DROP TABLE IF EXISTS QRTZ_TRIGGERS;
- DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
- DROP TABLE IF EXISTS QRTZ_CALENDARS;
- CREATE TABLE QRTZ_JOB_DETAILS(
- SCHED_NAME VARCHAR(120) NOT NULL,
- JOB_NAME VARCHAR(200) NOT NULL,
- JOB_GROUP VARCHAR(200) NOT NULL,
- DESCRIPTION VARCHAR(250) NULL,
- JOB_CLASS_NAME VARCHAR(250) NOT NULL,
- IS_DURABLE VARCHAR(1) NOT NULL,
- IS_NONCONCURRENT VARCHAR(1) NOT NULL,
- IS_UPDATE_DATA VARCHAR(1) NOT NULL,
- REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
- JOB_DATA BLOB NULL,
- PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_TRIGGERS (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- JOB_NAME VARCHAR(200) NOT NULL,
- JOB_GROUP VARCHAR(200) NOT NULL,
- DESCRIPTION VARCHAR(250) NULL,
- NEXT_FIRE_TIME BIGINT(13) NULL,
- PREV_FIRE_TIME BIGINT(13) NULL,
- PRIORITY INTEGER NULL,
- TRIGGER_STATE VARCHAR(16) NOT NULL,
- TRIGGER_TYPE VARCHAR(8) NOT NULL,
- START_TIME BIGINT(13) NOT NULL,
- END_TIME BIGINT(13) NULL,
- CALENDAR_NAME VARCHAR(200) NULL,
- MISFIRE_INSTR SMALLINT(2) NULL,
- JOB_DATA BLOB NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
- REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- REPEAT_COUNT BIGINT(7) NOT NULL,
- REPEAT_INTERVAL BIGINT(12) NOT NULL,
- TIMES_TRIGGERED BIGINT(10) NOT NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_CRON_TRIGGERS (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- CRON_EXPRESSION VARCHAR(120) NOT NULL,
- TIME_ZONE_ID VARCHAR(80),
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_SIMPROP_TRIGGERS(
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- STR_PROP_1 VARCHAR(512) NULL,
- STR_PROP_2 VARCHAR(512) NULL,
- STR_PROP_3 VARCHAR(512) NULL,
- INT_PROP_1 INT NULL,
- INT_PROP_2 INT NULL,
- LONG_PROP_1 BIGINT NULL,
- LONG_PROP_2 BIGINT NULL,
- DEC_PROP_1 NUMERIC(13,4) NULL,
- DEC_PROP_2 NUMERIC(13,4) NULL,
- BOOL_PROP_1 VARCHAR(1) NULL,
- BOOL_PROP_2 VARCHAR(1) NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_BLOB_TRIGGERS (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- BLOB_DATA BLOB NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
- INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
- FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
- REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_CALENDARS (
- SCHED_NAME VARCHAR(120) NOT NULL,
- CALENDAR_NAME VARCHAR(200) NOT NULL,
- CALENDAR BLOB NOT NULL,
- PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
- SCHED_NAME VARCHAR(120) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_FIRED_TRIGGERS (
- SCHED_NAME VARCHAR(120) NOT NULL,
- ENTRY_ID VARCHAR(95) NOT NULL,
- TRIGGER_NAME VARCHAR(200) NOT NULL,
- TRIGGER_GROUP VARCHAR(200) NOT NULL,
- INSTANCE_NAME VARCHAR(200) NOT NULL,
- FIRED_TIME BIGINT(13) NOT NULL,
- SCHED_TIME BIGINT(13) NOT NULL,
- PRIORITY INTEGER NOT NULL,
- STATE VARCHAR(16) NOT NULL,
- JOB_NAME VARCHAR(200) NULL,
- JOB_GROUP VARCHAR(200) NULL,
- IS_NONCONCURRENT VARCHAR(1) NULL,
- REQUESTS_RECOVERY VARCHAR(1) NULL,
- PRIMARY KEY (SCHED_NAME,ENTRY_ID))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_SCHEDULER_STATE (
- SCHED_NAME VARCHAR(120) NOT NULL,
- INSTANCE_NAME VARCHAR(200) NOT NULL,
- LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
- CHECKIN_INTERVAL BIGINT(13) NOT NULL,
- PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
- ENGINE=InnoDB;
- CREATE TABLE QRTZ_LOCKS (
- SCHED_NAME VARCHAR(120) NOT NULL,
- LOCK_NAME VARCHAR(40) NOT NULL,
- PRIMARY KEY (SCHED_NAME,LOCK_NAME))
- ENGINE=InnoDB;
- CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
- CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
- CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
- CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
- CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
- CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
- CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
- CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
- CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
- CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
- CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
- CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
- CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
- CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS
- (SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
- CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
- CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
- CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
- CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
- CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
- CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
- commit;
3,修改调度逻辑,运行时首先检查是否存在没有执行完的任务,如果存在,则继续之前未完成的任务
- package com.sean;
- import java.util.Date;
- import org.apache.log4j.Logger;
- import org.quartz.JobBuilder;
- import org.quartz.JobDetail;
- import org.quartz.JobKey;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerFactory;
- import org.quartz.SimpleScheduleBuilder;
- import org.quartz.SimpleTrigger;
- import org.quartz.Trigger;
- import org.quartz.TriggerBuilder;
- import org.quartz.TriggerKey;
- import org.quartz.impl.StdSchedulerFactory;
- public class Task {
- public static Logger myJobLog = Logger.getLogger("MyJob");
- public static void main(String[] args){
- try{
- SchedulerFactory factory = new StdSchedulerFactory();
- Scheduler scheduler = factory.getScheduler();
- TriggerKey tKey = new TriggerKey("MyTrigger", "Group");
- JobKey jKey = new JobKey("MyJob", "Group");
- if(scheduler.checkExists(tKey)){
- Trigger trigger = scheduler.getTrigger(tKey);
- scheduler.rescheduleJob(tKey, trigger);
- }else{
- JobDetail job = JobBuilder.newJob(MyJob.class)
- .withIdentity(jKey)
- .build();
- SimpleTrigger trigger = TriggerBuilder.newTrigger()
- .withIdentity(tKey)
- .startAt(new Date(System.currentTimeMillis()+5*1000))
- .withSchedule(SimpleScheduleBuilder.simpleSchedule()
- .withIntervalInSeconds(10).withRepeatCount(10))
- .build();
- scheduler.scheduleJob(job, trigger);
- }
- scheduler.start();
- Thread.sleep(2*60*1000);
- scheduler.shutdown(true);
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
首先运行一段时间(任务执行了2次)
然后关闭程序一点时间后,再次运行程序(当前的REPEAT_COUNT = 之前的REPEAT_COUNT - 之前的TIMES_TRIGGERED):
任务日志如下:
- 08-12 15:05:36->[Group.MyJob]My Job!!!
- 08-12 15:05:46->[Group.MyJob]My Job!!!
- 08-12 15:06:39->[Group.MyJob]My Job!!!
- 08-12 15:06:49->[Group.MyJob]My Job!!!
- 08-12 15:06:59->[Group.MyJob]My Job!!!
- 08-12 15:07:10->[Group.MyJob]My Job!!!
- 08-12 15:07:19->[Group.MyJob]My Job!!!
- 08-12 15:07:29->[Group.MyJob]My Job!!!
- 08-12 15:07:39->[Group.MyJob]My Job!!!
- 08-12 15:07:49->[Group.MyJob]My Job!!!
- 08-12 15:07:59->[Group.MyJob]My Job!!!
待解决的问题:
1,设置任务重复10次,但是根据任务日志,任务实际执行了11次。第十次时,数据库中的REPEAT_COUNT为10,TIMES_TRIGGERED也为10(在没有中断恢复的情况下),之后表中的调度信息被清空,日志中打印出任务第11次执行的结果
2,关闭程序后等待一段时间(具体是多长时间不确定),再次执行程序,Quartz将表现出上面提到的恢复过程,但是如果关闭程序后立马再次执行程序,任务调度将变得混乱,同一时刻将一下子运行多次任务,不清楚是什么情况,日志如下:
- 08-12 16:10:47->[DefaultQuartzScheduler_Worker-1][Group.MyJob]My Job!!!
- 08-12 16:10:57->[DefaultQuartzScheduler_Worker-2][Group.MyJob]My Job!!!
- 08-12 16:11:11->[DefaultQuartzScheduler_Worker-1][Group.MyJob]My Job!!!
- 08-12 16:11:11->[DefaultQuartzScheduler_Worker-2][Group.MyJob]My Job!!!
- 08-12 16:11:11->[DefaultQuartzScheduler_Worker-3][Group.MyJob]My Job!!!
- 08-12 16:11:17->[DefaultQuartzScheduler_Worker-4][Group.MyJob]My Job!!!
- 08-12 16:11:27->[DefaultQuartzScheduler_Worker-5][Group.MyJob]My Job!!!
- 08-12 16:11:37->[DefaultQuartzScheduler_Worker-6][Group.MyJob]My Job!!!
- 08-12 16:11:47->[DefaultQuartzScheduler_Worker-7][Group.MyJob]My Job!!!
- 08-12 16:11:57->[DefaultQuartzScheduler_Worker-8][Group.MyJob]My Job!!!
- 08-12 16:12:07->[DefaultQuartzScheduler_Worker-9][Group.MyJob]My Job!!!
将配置文件中的线程数改为1也不行,不清楚哪里有问题
- 任务调度(Quartz Enterprise Job Scheduler)
- 任务调度(Quartz Enterprise Job Scheduler)
- [译]Java定时任务调度-Quartz文档(二)Quartz API、Job & Scheduler
- Spring任务调度,Quartz Scheduler
- Java任务调度框架Quartz入门教程指南(三)任务调度框架Quartz实例详解深入理解Scheduler,Job,Trigger,JobDetail
- spring-scheduler-job分布式任务调度
- 说说Quartz Scheduler任务调度框架
- 企业级任务调度框架Quartz 六 任务调度器(Scheduler)
- Quartz 调度,添加,修改,删除 任务,Job
- Quartz Job & Spring 动态任务调度
- Quartz Job Scheduler Tutorials
- [译]Java定时任务调度-Quartz文档(三)进一步讲讲Job和Job Detail
- Spring 集成Quartz Scheduler 定时调度任务 Example
- Spring 集成Quartz Scheduler 定时调度任务 Example
- Spring 集成Quartz Scheduler 定时调度任务 Example
- java 用org.quartz.Scheduler 包写动态调度任务
- 使用Spring的Quartz Scheduler进行任务定时调度
- quartz-scheduler 调度系统
- oracle_sqlplus -variable、define..
- 后缀数组 (入门模板)
- ASP.NET权限管理(一)
- ccui.pageView基础应用
- C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结
- 任务调度(Quartz Enterprise Job Scheduler)
- 拉格朗日插值法在数据分析中的应用——Python插值scimpy,lagrange
- Android -理解ThreadLocal、Looper
- VC++计算某个日期是第几周
- Xamarin Android读写Contacts联系人
- org.apache.commons.logging.LogFactory
- Spring 3 AOP 概念介绍
- Fragment状态保存(四)
- ListView源码分析