# Quartz教程 - 2 HelloWorld
下面先来实现一个简单的定时任务,让大家了解一下。
# 1 新建项目
在 IDEA 中先创建一个项目
# 2 引入依赖
在项目的 pom.xml 中添加 Quartz 的依赖:
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.5.0-rc1</version>
</dependency>
<!-- 日志输出 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
如果不引入 slf4j-simple
,quartz 的日志是打印不出来的,但是要注意版本问题,因为 quartz 中的 slf4j-api
的版本是 1.7.x 的,这里我使用 2.x.x 版本的 slf4j-simple
因为版本不兼容,也无法打印。
如果使用 logback,引入 logback-classic
,也存在版本兼容问题,使用1.4.x 和 1.3.x都不行,需要使用 1.2.x 的 logback-classic
。
当然也可以排除 quartz 中的 slf4j-api
,重新引入新版本的 slf4j-api
。
# 3 创建 Job 类
创建一个 Job 类,名称自定义,需要实现 Job
接口,并实现 execute
方法。
MyJob.java
package com.doubibiji.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyJob implements Job {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("执行任务:" + sdf.format(new Date()));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
类中只有一个方法,实现了 Job 类中的 execute
方法,这里打印一下执行的时间。
# 4 编写定时任务
需要创建任务详情(JobDetail)、触发器(Trigger)、调度器(Scheduler)。
任务详情就是 JobDetail,这个 JobDetail 其实是对 Job 的包装和描述,每次执行任务,调度器就会根据 JobDetail 的描述信息通过反射创建一个新的 Job 实例,这样可以规避并发访问的问题。而且这样设计,可以让 Job 更加专注于业务逻辑。
我们创建一个测试类,在测试类中编写:
TestClass.java
package com.doubibiji;
import com.doubibiji.job.MyJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.concurrent.TimeUnit;
public class TestClass {
public static void main(String[] args) {
// 1.定义jobDetail,对MyJob进行包装,job1是任务名称,group1是任务分组
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "jGroup1")
.build();
// 2.定义触发器,trigger1是触发器的名称,group1是触发器的分组
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "tGroup1")
// 立刻执行
.startNow()
// 触发策略,用简单的触发策略,就是按照时间间隔执行
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
// 1秒执行一次
.withIntervalInSeconds(1)
// 一直重复
.repeatForever())
.build();
try {
// 3.定义调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 设置任务和触发器,由触发器进行分派任务
scheduler.scheduleJob(job, trigger);
scheduler.start();
// 让主线程延迟执行,scheduler如果shutdown,则所有的定时任务会取消。
TimeUnit.SECONDS.sleep(20);
scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
JobDetail 通过 JobBuilder 创建。Trigger 通过 TriggerBuilder 创建。在触发器上设置触发的时机,例如频率和次数等,然后将触发器和任务交给调度器来管理。
项目结构:
# 5 运行
执行后,会在控制台每秒打印一次日志,如下:
← 01-Quartz简介 03-传递参数 →