参考链接:http://blog.csdn.net/yuebinghaoyuan/article/details/9045471
参考链接:http://blog.csdn.net/hu1991die/article/details/44565029
核心概念
Quartz核心的概念
:scheduler任务调度、Job任务、Trigger触发器、JobDetail任务细节
Job任务:其实Job是接口,其中只有一个execute方法:
package org.quartz;
public abstract interface Job
{
public abstract void execute(JobExecutionContext paramJobExecutionContext)
throws JobExecutionException;
}
我们开发者只要实现此接口,实现execute方法即可。把我们想做的事情,在execute中执行即可。
JobDetail:任务细节,Quartz执行Job时,需要新建个Job实例,但是不能直接操作Job类,所以通过JobDetail来获取Job的名称、描述信息。
Trigger触发器:执行任务的规则;比如每天,每小时等。
一般情况使用SimpleTrigger,和CronTrigger,这个触发器实现了Trigger接口。
对于复杂的时间表达式来说,比如每个月15日上午几点几分,使用CronTrigger
对于简单的时间来说,比如每天执行几次,使用SimpleTrigger
scheduler任务调度:是最核心的概念,需要把JobDetail和Trigger注册到scheduler中,才可以执行。
具体实例1 :
QuartzUtil
package com.eastcom.first.spark.data.quartz;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class QuartzUtil {
private final static String JOB_GROUP_NAME = "QUARTZ_JOBGROUP_NAME";// 任务组
private final static String TRIGGER_GROUP_NAME = "QUARTZ_TRIGGERGROUP_NAME";// 触发器组
private static Logger log = LoggerFactory.getLogger(QuartzUtil.class);// 日志
/**
* 添加任务的方法
*
* @param jobName
* 任务名
* @param triggerName
* 触发器名
* @param jobClass
* 执行任务的类
* @param seconds
* 间隔时间
* @throws SchedulerException
*/
public static void addJob(String jobName, String triggerName, Class<? extends Job> jobClass, int seconds)
throws SchedulerException {
log.info("==================initialization=================");
// 创建一个SchedulerFactory工厂实例
SchedulerFactory sf = new StdSchedulerFactory();
// 通过SchedulerFactory构建Scheduler对象
Scheduler sche = sf.getScheduler();
log.info("===================initialize finshed===================");
log.info("==============add the Job to Scheduler==================");
// 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, JOB_GROUP_NAME).build();
// 构建一个触发器,规定触发的规则
Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder来规范一个触发器
.withIdentity(triggerName, TRIGGER_GROUP_NAME)// 给触发器起一个名字和组名
.startNow()// 立即执行
.withSchedule(SimpleScheduleBuilder.simpleSchedule() // 执行计划
.withIntervalInSeconds(seconds) // 执行间隔: 表
.repeatForever()// 一直执行
).build();// 产生触发器
// 向Scheduler中添加job任务和trigger触发器
sche.scheduleJob(jobDetail, trigger);
// 启动
sche.start();
}
}
TestJobOne
package com.eastcom.first.spark.data.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TestJobOne implements Job {
/**
* 执行任务的方法
*/
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("================执行任务一....");
// do more...这里可以执行其他需要执行的任务
}
}
TestJobTwo
package com.eastcom.first.spark.data.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TestJobTwo implements Job {
/**
* 执行任务的方法
*/
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("================执行任务二....");
// do more...这里可以执行其他需要执行的任务
}
}
QuartzClient
package com.eastcom.first.spark.data.quartz;
import org.quartz.SchedulerException;
public class QuartzClient {
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
try {
// 添加第一个任务 每隔2秒执行一次
QuartzUtil.addJob("job1", "trigger1", TestJobOne.class, 2);
// 添加第二个任务 每隔5秒执行一次
QuartzUtil.addJob("Job2", "trigger2", TestJobTwo.class, 5);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
运行结果
INFO | Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
INFO | Quartz scheduler version: 2.3.0
INFO | ===================initialize finshed===================
INFO | ==============add the Job to Scheduler==================
INFO | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
INFO | ==================initialization=================
INFO | ===================initialize finshed===================
INFO | ==============add the Job to Scheduler==================
INFO | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
================执行任务二....
================执行任务一....
================执行任务一....
================执行任务一....
================执行任务二....
================执行任务一....
================执行任务一....
QuartzUtil2
package com.eastcom.first.spark.data.quartz;
import org.quartz.CronScheduleBuilder;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class QuartzUtil2 {
private final static String JOB_GROUP_NAME = "QUARTZ_JOBGROUP_NAME";// 任务组
private final static String TRIGGER_GROUP_NAME = "QUARTZ_TRIGGERGROUP_NAME";// 触发器组
private static Logger log = LoggerFactory.getLogger(QuartzUtil2.class);// 日志
/**
* 添加任务的方法
*
* @param jobName
* 任务名
* @param triggerName
* 触发器名
* @param jobClass
* 执行任务的类
* @param seconds
* 间隔时间
* @throws SchedulerException
*/
public static void addJob(String jobName, String triggerName, Class<? extends Job> jobClass, String cronExpression)
throws SchedulerException {
log.info("==================initialization=================");
// 创建一个SchedulerFactory工厂实例
SchedulerFactory sf = new StdSchedulerFactory();
// 通过SchedulerFactory构建Scheduler对象
Scheduler sche = sf.getScheduler();
log.info("===================initialize finshed===================");
log.info("==============add the Job to Scheduler==================");
// 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, JOB_GROUP_NAME).build();
// 构建一个触发器,规定触发的规则
Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder来规范一个触发器
.withIdentity(triggerName, TRIGGER_GROUP_NAME)// 给触发器起一个名字和组名
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).startNow()// 立即执行
.build();// 产生触发器
// 向Scheduler中添加job任务和trigger触发器
sche.scheduleJob(jobDetail, trigger);
// 启动
sche.start();
}
}
QuartzClient2
package com.eastcom.first.spark.data.quartz;
import org.quartz.SchedulerException;
public class QuartzClient2 {
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
try {
String cronExpression1 = "0-55/5 * * * * ? *";
// 添加第一个任务 每隔5秒执行一次
QuartzUtil2.addJob("job1", "trigger1", TestJobOne.class, cronExpression1);
// 添加第二个任务 每隔10秒执行一次
String cronExpression2 = "0-50/10 * * * * ? *";
QuartzUtil2.addJob("Job2", "trigger2", TestJobTwo.class, cronExpression2);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
运行结果:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/org/apache/activemq/activemq-all/5.15.0/activemq-all-5.15.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.7.21/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
INFO | ==================initialization=================
INFO | Using default implementation for ThreadExecutor
INFO | Job execution threads will use class loader of thread: main
INFO | Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
INFO | Quartz Scheduler v.2.3.0 created.
INFO | RAMJobStore initialized.
INFO | Scheduler meta-data: Quartz Scheduler (v2.3.0) '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.
INFO | Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
INFO | Quartz scheduler version: 2.3.0
INFO | ===================initialize finshed===================
INFO | ==============add the Job to Scheduler==================
INFO | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
INFO | ==================initialization=================
INFO | ===================initialize finshed===================
INFO | ==============add the Job to Scheduler==================
INFO | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
================执行任务一....
================执行任务一....
================执行任务二....
over