Quartz学习笔记(一)快速入门

最近在工作中用到了Quartz,趁此机会学习了一下,顺便写些笔记记录一下。
参照Quartz官方文档

什么是Quartz

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目。
它完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。

Quartz 核心概念

我们需要明白 Quartz 的几个核心概念,这样理解起 Quartz 的原理就会变得简单了

  1. Job 表示一个工作,要执行的具体内容。此接口中只有一个方法:
void execute(JobExecutionContext context) 
  1. JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
  2. Trigger 代表一个调度参数的配置,什么时候去调
  3. Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了

Quartz的运行环境

  • Quartz 可以运行嵌入在另一个独立式应用程序。
  • Quartz 可以在应用程序服务器(或 servlet 容器)内被实例化,并且参与 XA 事务。
  • Quartz 可以作为一个独立的程序运行(其自己的 Java 虚拟机内),可以通过 RMI 使用
  • Quartz 可以被实例化,作为独立的项目集群(负载平衡和故障转移功能),用于作业的执行。

快速入门

快速搭建好springboot项目,引入Quartz依赖

<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.3.0</version>
</dependency>

实现org.quartz.Job,创建自己的job实现

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * @author chunhui.tan
 * @创建时间 2019年3月15日 下午3:06:08
 *
 */
public class HelloJob implements Job {

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		System.err.println("hello,quartz");
	}

}

实例化SchedulerFactory,获取Scheduler实例,构建JobDetail,Trigger。然后用Scheduler实例将JobDetail,Trigger加入调度容器并start。
scheduler被停止后,除非重新实例化,否则不能重新启动;只有当scheduler启动后,即使处于暂停状态也不行,trigger才会被触发(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.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @author chunhui.tan
 * @创建时间 2019年3月15日 下午3:01:38
 *  */
public class HelloQuartz {

	public static void main(String[] args) throws SchedulerException {
		//构建SchedulerFactory实例
		SchedulerFactory schedFact = new StdSchedulerFactory();
		//获取Scheduler实例
		Scheduler scheduler = schedFact.getScheduler();
		//构建JobDetail实例
		JobDetail job = JobBuilder.newJob(HelloJob.class)
				                  .withIdentity("helloJob", "hello")//给job命名并分组
				                  .build();
		//构建Trigger实例
		SimpleTrigger trigger = TriggerBuilder.newTrigger()
				                              .withIdentity("helloTrigger", "hello")//给trigger命名并分组
				                              .startNow()
				                              .withSchedule(SimpleScheduleBuilder
				                              .simpleSchedule().withIntervalInSeconds(5).repeatForever())
				                              .build();
		//将JobDetail实例和Trigger实例加入到调度容器
		scheduler.scheduleJob(job, trigger);
		//启动容器
		scheduler.start();
	}
}

结果

hello,quartz
19:56:07.382 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'hello.helloJob', class=com.quartz.test.HelloJob
hello,quartz
19:56:07.383 [DefaultQuartzScheduler_Worker-2] DEBUG org.quartz.core.JobRunShell - Calling execute on job hello.helloJob
19:56:07.383 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
19:56:12.382 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'hello.helloJob', class=com.quartz.test.HelloJob
19:56:12.382 [DefaultQuartzScheduler_Worker-3] DEBUG org.quartz.core.JobRunShell - Calling execute on job hello.helloJob
19:56:12.382 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
hello,quartz

Quartz API

Quartz API的关键接口是:

  • Scheduler - 与调度程序交互的主要API。
  • Job - 由希望由调度程序执行的组件实现的接口
  • JobDetail - 用于定义作业的实例。
  • Trigger(即触发器) - 定义执行给定作业的计划的组件。
  • JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
  • TriggerBuilder - 用于定义/构建触发器实例。

Scheduler作为Quartz的核心API,相当于一个调度容器,负责管理Job,JobDetail,Trigger。
Job里面主要是一些业务内容,而JobDetail 则封装了一些Job的属性,比如job的名称和分组。
Trigger主要封装一些调度要素,比如调度周期,开始时间,结束时间等等。

Scheduler的生命期

Scheduler的生命期, 从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)

builder类

JobBuilder 主要构建JobDetail
SchedulerBuilder 定义不同类型的调度计划(schedule)
- CronScheduleBuilder 定义corn表达式类型的schedule
- SimpleScheduleBuilder 定义简单类型的schedule
TriggerBuilder 定义Trigger
DateBuilder 可以很方便地构造表示不同时间点的java.util.Date实例

猜你喜欢

转载自blog.csdn.net/qq_38846242/article/details/88648522