一、相关介绍
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由Java开发的一个开源的任务日程管理系统
二、概念和类
Job:要执行的作业类所实现的接口
JobDetail:定义作业实例的详细信息属性
Trigger:触发器接口,Quartz中提供了SimpleTrigger、CronTirgger和Calendar等多种触发器
Scheduler:任务记录表,调度器实例
三、存储方式
RAMJobStore:不要外部数据库,配置容易,运行速度快
JDBCJobStore:支持集群,所有的任务信息都会保存到数据库中。可以控制事物;应用服务器关闭或者重启,任务信息都不会丢失且可以恢复因此而导致执行失败的任务
四、线程模型
调度主线程:QuartzScheduler被创建时会创建一个QuartzSchedulerThread的调度主线程实例
任务执行线程:Quartz不会在主线程(QuartzSchedulerThread)中处理用户的Job,而是把线程管理的职责委托给ThreadPool,一般的设置是使用SimpleThreadPool。SimpleThreadPool创建了一定数量的WorkerThread实例来使得Job能够在线程中进行处理。WorkerThread是定义在SimpleThreadPool类中的内部类,它实质上就是一个线程
五、使用示例
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由Java开发的一个开源的任务日程管理系统
二、概念和类
Job:要执行的作业类所实现的接口
JobDetail:定义作业实例的详细信息属性
Trigger:触发器接口,Quartz中提供了SimpleTrigger、CronTirgger和Calendar等多种触发器
Scheduler:任务记录表,调度器实例
三、存储方式
RAMJobStore:不要外部数据库,配置容易,运行速度快
JDBCJobStore:支持集群,所有的任务信息都会保存到数据库中。可以控制事物;应用服务器关闭或者重启,任务信息都不会丢失且可以恢复因此而导致执行失败的任务
四、线程模型
调度主线程:QuartzScheduler被创建时会创建一个QuartzSchedulerThread的调度主线程实例
任务执行线程:Quartz不会在主线程(QuartzSchedulerThread)中处理用户的Job,而是把线程管理的职责委托给ThreadPool,一般的设置是使用SimpleThreadPool。SimpleThreadPool创建了一定数量的WorkerThread实例来使得Job能够在线程中进行处理。WorkerThread是定义在SimpleThreadPool类中的内部类,它实质上就是一个线程
五、使用示例
package com.xl.quartz;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*自定义任务类
*/
public class SimpleJob implements Job {
private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class);
private String desc;
/**
* Job是一个接口,只有一个execute方法,JobExecutionContext提供了任务调度的上下文信息
*/
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println(context.getJobDetail().getJobDataMap().get("desc")); // 非空
System.out.println(this.desc); // 为空
LOG.debug("Job start, time={}.", new Date().getTime());
}
public void setDesc(String desc) {
this.desc = desc;
}
}
package com.xl.quartz;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Quartz启动类
*
*/
public class SimpleQuartzMain {
private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class);
public static void main(String[] args) throws SchedulerException {
/**
* 1. 创建Scheduler的工厂
*/
SchedulerFactory sf = new StdSchedulerFactory();
/**
* 2. 从工厂中获取调度器实例
*/
Scheduler scheduler = sf.getScheduler();
/**
* 3. 创建JobDetail,定义任务的实现细节和相关属性
*/
JobDetail simpleJobDetail = new JobDetail("simpleJD", "simpleGP", SimpleJob.class); // 设置名字和组名标识当前任务细节
simpleJobDetail.getJobDataMap().put("desc", "Description(By JobDataMap)."); // 如果Job有参数需要设置,可以从这里赋值 (测试1.6.x,非集成Spring时不能给Job的同名属性自动注入)
/**
* 4. 创建Trigger,定义触发规则
* 如果嵌入的事件只触发一次或者以固定时间间隔触发,则使用SimpleTrigger比较合适
* 如果嵌入的事件以固定的时间点如每天十点触发,则使用CronTrigger比较合适
*/
SimpleTrigger simpleTrigger = new SimpleTrigger("simpleST", "simpleTG"); // 设置名字和组名标识当前触发器
simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 2 * 1000L)); // 设置开始时间,延时2秒钟
simpleTrigger.setRepeatInterval(2000); // 设置多久重复一次,2秒钟一次
simpleTrigger.setRepeatCount(-1); // -1表示无限次数,0表示只执行一次,默认0
/**
* 5. 注册任务和定时器
*/
scheduler.scheduleJob(simpleJobDetail, simpleTrigger);
/**
* 6. 启动调度器
*/
scheduler.start();
LOG.info("Scheduler start...");
}
}
六、补充配置
#log4j config
log4j.rootLogger = debug,system.out
log4j.appender.system.out=org.apache.log4j.ConsoleAppender
log4j.appender.system.out.layout=org.apache.log4j.PatternLayout
log4j.appender.system.out.layout.ConversionPattern=%d %p [%c] [%t] [%F:%L] - <%m>%n
<!-- pom.xml -->
<dependency>
<groupId>org.opensymphony.quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>