简介
Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业,它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联 Quartz-1.x与Quartz-2.x在使用上差别较大 这里介绍2.x版本
核心概念
架构图
核心接口及类
- Job :任务 它是一个接口,只有一个方法
void execute(JobExecutionContext context)
开发者实现该接口来定义自己的任务 ,其中JobExecutionContext类提供了调度上下文的各种信息,Job运行时的信息保存在JobDataMap实例中 - JobDetail:Quartz在每次执行Job时,接受一个Job实现类,JobDetail 描述了Job实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息
- Trigger:是一个类,它描述了触发Job执行的时间规则,简单说就是设置作业执行的时间、参数、条件等,主要有SimpleTrigger和CronTrigger这两个子类。CronTrigger支持Cron表达式,可以定义出复杂的时间规则
- Calendar:org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合,一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。
- Scheduler:调度器 代表一个Quartz的独立运行容器,负责调度作业和触发器,JobDetail和Trigger可以注册在Scheduler中,拥有各自唯一的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据
- ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。
关系
Scheduler把Trigger绑定到某一个JobDetail上,这样当Trigger触发时对应的Job就会执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler,Scheduler里有一个SchedulerContext,它保存着Scheduler上下文件信息,类似与ServletContext,Job和Trigger都可以访问它。SchedulerContext内部有一个Map,以键值对的形式维护着上下文件信息,可以通过Scheduler.getContext()获取SchedulerContext对象
单独使用
官网下载quartz包,将核心依赖quartz-x.x.x.jar以及相关jar包导入工程中
如果是Maven项目 引入依赖jar包
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency>
编写job类
12345678910111213141516package top.lilixin;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import java.util.Date;/*** Created by lilixin on 03/08/2017.*/public class MyJob implements Job{public void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("my job is running ,time="+new Date());}}编写调度器
123456789101112131415161718192021222324252627282930313233343536373839package top.lilixin;import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;/*** created by lilixin*/public class MyTask{public static void main( String[] args ){//通过SchedulerFactory 获取调度器 schedulerSchedulerFactory factory = new StdSchedulerFactory();try {Scheduler scheduler = factory.getScheduler();//引进作业程序JobBuilder jobBuilder = JobBuilder.newJob();JobDetail jobDetail = jobBuilder.newJob(MyJob.class).withIdentity("job1","group1").build();//新建一个时间Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever()).build();//作业和触发器设置到调度器里scheduler.scheduleJob(jobDetail,trigger);//启动调度器scheduler.start();} catch (SchedulerException e) {e.printStackTrace();}}}