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也不行,不清楚哪里有问题

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐