Java:定时任务 Quartz

Java 中执行定时任务,常用 Quartz 简介。

https://github.com/quartz-scheduler/quartz

官方说明(谷歌翻译):

Quartz Job Scheduling Library是什么?

Quartz是功能丰富的开源作业调度库,几乎可以集成到任何Java应用程序中-从最小的独立应用程序到最大的电子商务系统。 Quartz可用于创建简单或复杂的计划,以执行数以万计,数以万计的工作。 任务定义为标准Java组件的作业,它们实际上可以执行您可以对其执行的任何编程操作。 Quartz Scheduler包含许多企业级功能,例如对JTA事务和集群的支持。

What Can Quartz Do For You?

如果您的应用程序具有需要在给定的时间点执行的任务,或者您的系统具有周期性的维护工作,那么Quartz可能是您的理想解决方案。

Quartz作业调度的示例用法:

  • 推动流程工作流程:最初下达新订单时,安排一个Job在正好2个小时内触发,这将检查该订单的状态,并在尚未收到该订单的订单确认消息时触发警告通知, 并将订单状态更改为“等待干预”。
  • 系统维护:计划一个工作,以便在每个工作日(除节假日之外的所有工作日)晚上11:30将数据库的内容转储到XML文件中。

  • 在应用程序内提供提醒服务。

依赖

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>

示例

每隔一秒打印一个 hello

QuartzTest.java

1
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
package com.tracenote.Utils;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.concurrent.TimeUnit;


public class QuartzTest {
public static void main(String[] args) throws SchedulerException, InterruptedException {
// 1、创建调度器Scheduler
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 2、创建JobDetail实例,并与PrintWordsJob类绑定(Job执行内容)
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1", "group1").build();
// 3、构建Trigger实例,每隔1s执行一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
.startNow()//立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)//每隔1s执行一次
.repeatForever()).build();//一直执行

//4、执行
scheduler.scheduleJob(jobDetail, trigger);
System.out.println("--------scheduler start ! ------------");
scheduler.start();

//睡眠
TimeUnit.MINUTES.sleep(1);
scheduler.shutdown();
System.out.println("--------scheduler shutdown ! ------------");

}
}

HelloJob.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.tracenote.Utils;

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

public class HelloJob implements Job {


@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("hello");
}
}

在实际工程实践中,一般常用使用 CronTrigger

1
2
3
4
5
6
7
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
.usingJobData("trigger1", "这是jobDetail1的trigger")
.startNow()//立即生效
.startAt(startDate)
.endAt(endDate)
.withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * 1/5 *"))
.build();

Crontab,限于篇幅,改天再详细介绍。即Linux crontab 命令。

1
2
3
4
5
6
7
8
*    *    *    *    *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 7) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)