quartz入门

quartz是Java中很强大的调度工具,它的使用比较简单,但是实际上无论从源码量以及实际生产中的规模化应用看,实际上quartz相当复杂,要想用好实际上也是不容易的。

下图是quartz的整体架构图,基本展示了quartz组件的相关关系。

  • JobDetail是具体的任务
  • Trigger是触发器,确定什么时候去做什么
  • scheduler是调度器,整体上调度trigger和job。

quartz原生代码都是使用Builder模式来定义。

1.quartz maven依赖

quartz似乎更新不是很频繁,官网的最新版本是2.2.3,但是用的比较广泛的是2.2.1。为了演示项目,加入了junit和logback。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.11</version>
</dependency>
</dependencies>

2.定义Job

Job就是任务的定义,比如定义了一个任务是从指定host:port的redis中收集慢查询,其中host:port可以通过定义属性或者通过JobExecutionContext获取JobDataMap来获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.carlosfu.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author fulei.fl 2017年12月29日 下午3:39:32
*/
public class HelloJob implements Job {
private Logger logger = LoggerFactory.getLogger(HelloJob.class);
public void execute(JobExecutionContext context) throws JobExecutionException {
logger.info("hello quartz!");
}
}

3.定义JobDetail

而JobDetail就是具体的任务了,每个任务可以用name和group进行区分(withIdentity)。

1
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("helloJob", "group1").build();

4.定义Trigger

Trigger包含了两种类型SimpleTrigger和CronTrigger(可以通过cron表达式设置,个人认为可以基本代替SimpleTrigger的功能)。

1
2
3
4
5
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("helloTrigger", "group1").startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2).repeatForever())
.build();

5.定义Scheduler

1
2
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();

启动

1
scheduler.start();

调度任务

1
scheduler.scheduleJob(jobDetail, trigger);