任务调度(Quartz Enterprise Job Scheduler)

来源:互联网 发布:中教数据库怎么样 编辑:程序博客网 时间:2024/04/20 07:44

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%nlog4j.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: DefaultQuartzSchedulerorg.quartz.scheduler.rmi.export: falseorg.quartz.scheduler.rmi.proxy: falseorg.quartz.scheduler.wrapJobExecutionInUserTransaction: falseorg.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount: 10org.quartz.threadPool.threadPriority: 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: trueorg.quartz.jobStore.misfireThreshold: 60000org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

控制台显示结果:

08-07 14:28:06->Using default implementation for ThreadExecutor08-07 14:28:06->Job execution threads will use class loader of thread: main08-07 14:28:06->Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl08-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.108-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: DefaultQuartzSchedulerorg.quartz.scheduler.rmi.export: falseorg.quartz.scheduler.rmi.proxy: falseorg.quartz.scheduler.wrapJobExecutionInUserTransaction: falseorg.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount: 10org.quartz.threadPool.threadPriority: 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: trueorg.quartz.jobStore.misfireThreshold: 60000org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.dataSource = myMySQLorg.quartz.dataSource.myMySQL.driver = com.mysql.jdbc.Driverorg.quartz.dataSource.myMySQL.URL = jdbc:mysql://127.0.0.1:3306/testorg.quartz.dataSource.myMySQL.user = rootorg.quartz.dataSource.myMySQL.password = 123456org.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也不行,不清楚哪里有问题

 

0 0
原创粉丝点击