我们通过一个简单的Java Project项目来看一下,Quartz框架任务调度的使用流程。这里我们用Maven管理。
项目中用到的Jar包,直接通过Build Path导入即可。Jar包放在lib文件夹下面。如有需要,可以联系博主,提供项目源码
一共需要下面几个新增Jar包:
D:\quartz-2.2.3\lib\c3p0-0.9.1.1.jar
D:\quartz-2.2.3\lib\log4j-1.2.16.jar
D:\quartz-2.2.3\lib\quartz-2.2.3.jar
D:\quartz-2.2.3\lib\quartz-jobs-2.2.3.jar
D:\quartz-2.2.3\lib\slf4j-api-1.7.7.jar
D:\quartz-2.2.3\lib\slf4j-log4j12-1.7.7.jar
commons-logging-1.0.3.jar
Jar包也可以去Quartz官网下载,下载地址:http://www.quartz-scheduler.org/downloads/
1,其中的pom.xml文件内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yangcq</groupId>
<artifactId>QuartzTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>QuartzTest</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2,然后定义一个我们自己的任务类 EBankJob,EBankJob实现Quartz框架的Job接口,重写
public void execute(JobExecutionContext context) throws JobExecutionException 方法,这个方法里面定义任务的具体内容。
package com.yangcq.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
*
* @author yangcq
* @description 需要jar包 quartz-1.6.6.jar 的支持
* @since 实现Job接口
*
*/
public class EBankJob implements Job {
/**
* 在quartz里,我们具体要执行的任务就是通过实现接口Job来定义的。在这里的实现仅仅是打印一个字符串。
* 定义好需要执行的任务之后,我们需要的是来定义任务执行的细节了。既然quartz是用来实现计划任务的功能,
* 那么很多执行计划任务需要考虑到的东西就应该在这里定义了。比如说既然这个任务定义好了,
* 它什么时候开始执行呢?需要执行一次还是多少次呢?每次执行的周期是多久呢?
* 于是我们调用执行这个任务的代码实现如下:public class QuartzJobTest
*/
public void execute(JobExecutionContext context) throws JobExecutionException{
// 这里定义我们执行的定时任务的具体内容,比如订单处理完成以后,我们可以修改订单状态字段。
System.out.println("定时任务开始执行...");
// 获取当前执行的定时任务的细节
System.out.println("context.getJobDetail()=" + context.getJobDetail());
// 获取当前执行的定时任务的名称
System.out.println("context.getJobDetail().getKey()=" + context.getJobDetail().getKey());
// 获取当前执行的触发器的细节
System.out.println("context.getTrigger() = " + context.getTrigger());
// 获取当前执行的触发器的名称
System.out.println("context.getTrigger().getKey() = " + context.getTrigger().getKey());
// 获取当前执行定时任务的时间
System.out.println("context.getScheduledFireTime() = " + context.getScheduledFireTime());
}
/**
* Job接口源代码:
*
* package org.quartz;
* public abstract interface Job
* {
* public abstract void execute(JobExecutionContext paramJobExecutionContext) throws JobExecutionException;
* }
*/
}
</pre></p><p><span style="font-size:14px;">3,接下来我们写调度任务的实现细节,比如什么时间执行?执行周期? </span></p><p><span style="font-size:14px;"></span><pre name="code" class="java">package com.yangcq.quartz;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
/**
*
* @author yangcq
* @description 简单的任务调度程序
*
*/
public class QuartzJobTest{
//Jar包冲突会报错:java.lang.IncompatibleClassChangeError: Implementing class
// 定义定时任务的执行逻辑 cronExpression
private final static String CRON_EXPRESSION = "0/20 * * * * ?";
// 定义任务名称(自定义)
private final static String JOB_NAME = "JOB_NAME";
// 定义任务组名称
private final static String GROUP_NAME = "GROUP_NAME";
// 定义触发器名称
private final static String TRIGGER_NAME = "TRIGGER_NAME";
public static void main( String[] args ) throws Exception{
// 创建一个Scheduler对象,它用来真正调度和执行job
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
// 注册我们定义的job 这里引用了我们前面定义的EBankJob.class
JobDetail job = JobBuilder.newJob(EBankJob.class).withIdentity(JOB_NAME, GROUP_NAME).build();
// 定义触发这些任务的细节。这里的CronScheduleBuilder定义了该任务每20秒执行一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(TRIGGER_NAME, GROUP_NAME).withSchedule(CronScheduleBuilder.cronSchedule(CRON_EXPRESSION)).build();
sched.scheduleJob(job, trigger);
// 通过scheduler启动job
sched.start();
Thread.sleep(60L * 1000L);
sched.shutdown(true);
}
}
项目运行结果:
log4j:WARN No appenders could be found for logger (org.quartz.impl.StdSchedulerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
定时任务开始执行...
context.getJobDetail()=JobDetail 'GROUP_NAME.JOB_NAME': jobClass: 'com.yangcq.quartz.EBankJob concurrentExectionDisallowed: false persistJobDataAfterExecution: false isDurable: false requestsRecovers: false
context.getJobDetail().getKey()=GROUP_NAME.JOB_NAME
context.getTrigger() = Trigger 'GROUP_NAME.TRIGGER_NAME': triggerClass: 'org.quartz.impl.triggers.CronTriggerImpl calendar: 'null' misfireInstruction: 0 nextFireTime: Sun Jul 24 09:52:40 GMT 2016
context.getTrigger().getKey() = GROUP_NAME.TRIGGER_NAME
context.getScheduledFireTime() = Sun Jul 24 09:52:30 GMT 2016