介绍
Quartz框架是一个全功能、开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。
Job:任务,实现该接口,实现execute方法,把任务放到execute中执行即可。
JobDetail:任务细节,Quartz执行Job时,需要新建个Job实例,但是不能直接操作Job类,所以通过JobDetail来获取Job的名称、描述信息。
Trigger触发器:执行任务的规则;比如每天,每小时等。
一般情况使用SimpleTrigger,和CronTrigger,这个触发器实现了Trigger接口。
对于复杂的时间表达式来说,比如每个月15日上午几点几分,使用CronTrigger
对于简单的时间来说,比如每天执行几次,使用SimpleTrigger
scheduler任务调度:是最核心的概念,需要把JobDetail和Trigger注册到scheduler中,才可以执行。
导入Jar包
上官网 http://www.quartz-scheduler.org 下载对应的jar包,导入即可
使用maven对应的pom文件如下,大家自行添加version即可
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
创建quartz.properties
在对应的包导入后,开始我们的demo了,首先配置我们的quertz,在resources文件加下创建quartz.properties文件,内容如下
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
创建log4j.properties
创建log4j.properties文件,调试输出日志,内容如下
log4j.rootCategory=DEBUG, stdout
log4j.rootLogger=DEBUG, stdout, FILE
#
### stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p - %m%n
## \u8F93\u51FA\u6587\u4EF6\u914D\u7F6E ###
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.Append=true
log4j.appender.FILE.File=./logs/root.log
log4j.appender.FILE.Threshold=DEBUG
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE.MaxFileSize=10MB
#
把配置文件都搞好了开始写代码了
HelloJob.java
创建 HelloJob类,实现Job接口,重写execute方法,代码如下
package com.v.test;
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 HelloJob implements Job{
Logger _log = LoggerFactory.getLogger(HelloJob.class);
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
_log.info("Hello World! - " + new Date());
}
}
QuartzTest.java
实现Runnable接口,不断创建Job任务,通过Scheduler调度任务,代码如下
package com.v.test;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import java.util.Date;
import org.junit.Test;
import org.quartz.JobDetail;
import static org.quartz.SimpleScheduleBuilder.*;
public class QuartzTest implements Runnable {
public static Trigger trigger = null;
public static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
public static Scheduler scheduler = null;
public static void main(String[] args) {
try {
scheduler = schedulerFactory.getScheduler();
Date runTime = new Date();
// Trigger the job to run now, and then repeat every 40 seconds
trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
// and start it off
scheduler.start();
} catch (Exception se) {
se.printStackTrace();
}
QuartzTest quartzTest = new QuartzTest();
Thread thread = new Thread(quartzTest);
thread.start();
}
@Override
public void run() {
while (true) {
JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();
try {
scheduler.scheduleJob(job, trigger);
Thread.sleep(10000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
运行日志如下
18:15:05,038 INFO - Using default implementation for ThreadExecutor
18:15:05,056 INFO - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
18:15:05,057 INFO - Quartz Scheduler v.2.2.1 created.
18:15:05,058 INFO - RAMJobStore initialized.
18:15:05,060 INFO - Scheduler meta-data: Quartz Scheduler (v2.2.1) 'MyScheduler' 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 3 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
18:15:05,060 INFO - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
18:15:05,061 INFO - Quartz scheduler version: 2.2.1
18:15:05,064 INFO - Scheduler MyScheduler_$_NON_CLUSTERED started.
18:15:05,064 DEBUG - batch acquisition of 0 triggers
18:15:05,068 DEBUG - batch acquisition of 1 triggers
18:15:05,070 DEBUG - Producing instance of Job 'group1.job1', class=com.v.test.HelloJob
18:15:05,074 DEBUG - batch acquisition of 0 triggers
18:15:05,075 DEBUG - Calling execute on job group1.job1
18:15:05,077 INFO - Hello World! - Mon May 01 18:15:05 CST 2017
18:15:06,058 DEBUG - Checking for available updated version of Quartz...
18:15:15,068 DEBUG - batch acquisition of 1 triggers
18:15:15,070 DEBUG - Producing instance of Job 'group1.job1', class=com.v.test.HelloJob
18:15:15,071 DEBUG - batch acquisition of 0 triggers
18:15:15,071 DEBUG - Calling execute on job group1.job1
18:15:15,071 INFO - Hello World! - Mon May 01 18:15:15 CST 2017
至此,整个demo完成
附上源码 QuartzDemo