1. 背景
由于最新的工作项目中,需要使用quartz框架,以完成相关的任务的定时执行。经过两周的调研与使用,本系列博客会参考官网及网上相关博客,结合工作项目中的使用,详细介绍quartz的各个方面。如果有相关的错误,烦请不吝赐教。如果有相关的疑惑,可以评论,本人会抽空解答。
2. quartz是什么?
Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.
基于官网解释,可以看出quartz是开源且具有丰富特性的"任务调度库",能够集成于任何的java应用,小到独立的应用,大至电子商业系统。quartz能够创建亦简单亦复杂的调度,以执行上十、上百,甚至上万的任务。任务job被定义为标准的java组件,能够执行任何你想要实现的功能。quartz调度框架包含许多企业级的特性,如JTA事务、集群的支持。
简而言之,quartz就是基于java实现的任务调度框架,用于执行你想要执行的任何任务。其次,quartz也支持.Net平台。
3. quartz的下载
quartz目前的最新版本为quartz-2.2.3,下载有两种方式,完整包或Maven依赖。
(1) 完整包的下载
完整包的下载地址:quartz-2.2.3-distribution.tar.gz,完整包中包含例子、源码、依赖以及说明文档等
(2) Maven依赖的导入
官网目前提供的Maven依赖为2.2.1,mvnrepository目前已支持2.3.0,版本之间的更新特性本人尚未研究。quartz的依赖至少有sl4j-api相关的jar包。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
<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>
4. quartz的主要模块
quart主要有三个核心模块:Scheduler、Job、Trigger
(1) Job
Job就是你想要实现的任务类,每一个Job必须实现org.quartz.job接口,且只需实现接口定义的execute()方法。
(2) Trigger
Trigger为你执行任务的触发器,比如你想每天定时3点发送一份统计邮件,Trigger将会设置3点进行执行该任务。Trigger主要包含两种SimpleTrigger和CronTrigger两种。关于二者的区别的使用场景,后续文章会进行讨论。
(3) Scheduler
Scheduler为任务的调度器,它会将任务job及触发器Trigger整合起来,负责基于Trigger设定的时间来执行Job。
5. quartz的简单使用
例:现在想要实现一个每10秒打印一次"Hello World"的任务。
(1) 定义任务Job
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package org.ws.quartz.test1; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorldJob implements Job{ private static Logger logger = LoggerFactory.getLogger(HelloWorldJob.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { logger.info("Hello World"); } }
(2) 调度主方法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
package org.ws.quartz.test1; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; 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 SimpleQuartzExample { private static Logger logger = LoggerFactory.getLogger(SimpleQuartzExample.class); public static void main(String[] args) throws SchedulerException, InterruptedException { SimpleQuartzExample exam = new SimpleQuartzExample(); logger.info("init scheduler componets"); // 创建任务 JobDetail jobDetail = exam.createJobDetail(); // 创建触发器 Trigger trigger = exam.createTrigger(); // 创建调度器 Scheduler scheduler = exam.createScheduler(); // 构建调度任务 scheduler.scheduleJob(jobDetail, trigger); logger.info("execute scheduler"); // 开启调度器 scheduler.start(); // 一分钟后关闭调度器 Thread.sleep(60000); scheduler.shutdown(); logger.info("shut down scheduler"); } protected Scheduler createScheduler() throws SchedulerException{ return StdSchedulerFactory.getDefaultScheduler(); } protected JobDetail createJobDetail(){ return JobBuilder.newJob(HelloWorldJob.class) // 待执行的任务 .withIdentity("HelloWorld_Job", "HelloWorld_Group") // 名称与组名组成Scheduler中任务的唯一标识 .build(); // 构建 } protected Trigger createTrigger(){ return TriggerBuilder.newTrigger() .withIdentity("HelloWorld_Trigger", "HelloWorld_Group") // 名称与组名组成Scheduler中触发器的唯一标识 .withSchedule( SimpleScheduleBuilder.simpleSchedule() // 创建SimpleTrigger .withIntervalInSeconds(10) // 10秒间隔 .repeatForever() // 重复循环 ).build(); // 构建 } }
(3) 运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
2017-07-09 12:51:10 [INFO]-[org.ws.quartz.test1.SimpleQuartzExample] init scheduler componets 2017-07-09 12:51:11 [INFO]-[org.ws.quartz.test1.SimpleQuartzExample] execute scheduler 2017-07-09 12:51:11 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World 2017-07-09 12:51:21 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World 2017-07-09 12:51:31 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World 2017-07-09 12:51:41 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World 2017-07-09 12:51:51 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World 2017-07-09 12:52:01 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World 2017-07-09 12:52:11 [INFO]-[org.ws.quartz.test1.HelloWorldJob] Hello World 2017-07-09 12:52:11 [INFO]-[org.ws.quartz.test1.SimpleQuartzExample] shut down scheduler
(4) 分析
该例简单说明了quartz的基本使用方式,构建调度器使用标准工厂中的默认调度器StdSchedulerFactory.getDefaultScheduler(),Job由JobBuilder进行构建,使用简单触发器SimpleTrigger,调度器的开启直接使用scheduler.start()开启即可,关闭时,调度器shutdown()方法。