任务调度(Quartz Enterprise Job Scheduler)
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也不行,不清楚哪里有问题
更多推荐
所有评论(0)