Quartz任务调度
1. 什么是任务调度
任务调度:根据时间,执行任务。
生活案例:
- 比如生活中的闹钟,我们设置闹钟每天早上七点执行响铃操作。我们给这个闹钟设定了时间,并且也给它设置了要进行执行的具体任务。关于这样的业务我们就称之为任务调度。
- 在订单支付中,就引用任务调度这么一个功能。比如说,当用户在预订完酒店后,如果在两个小时内没有支付,那么就自动会被取消掉。关于这样的功能我们如何去解决呢?
解决方案:
每十分钟扫描一下订单,来看一下订单库中有没有超过两个小时还没有支付的订单, 如果有的话就把订单给取消掉。这样的一个功能,它也有两个关键点,一个是每十分钟 执行一次。第二个关键点是具体要执行的任务是:对于那些超过两个小时还没有支付 的订单查询出来,然后进行一个取消的操作。那么具体如何实现呢?就要学习一下 Quartz框架。
2. Quartz框架
官网: http://www.quartz-scheduler.org
核心概念:任务(Job)、触发器(Trigger)、调度器(Scheduler)
3. Quartz工作原理
- 任务:需要执行的具体工作。
- 触发器:在特定的时间触发任务的执行。
- 调度器:任务的实际执行者,负责粘合任务和触发器。
使用Quartz框架编写定时任务
1. Quartz环境初始化
- 创建一个普通的Maven项目,包名cn.quartz 项目名TestQuartz。
- 将Quartz所需要的Maven依赖进行添加。
<!-- START === Quartz所需要的依赖 === START-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency>
<!-- END ===== Quartz所需要的依赖 ===== END-->
2. Quartz之任务
任务:需要执行的具体工作。
public class RemindJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//提醒服务类,封装提醒业务
System.out.println("我正在执行....");
}
}
上面是Job类中的业务代码,在业务代码编写完后,要具体如何去调用这个Job呢?这就需要创建JobDetail实例对象。
//1、创建Job任务, 第一个参数是Job的名字, 第二个参数是Job的所属分组 第三个是具体Job的class
JobDetail job = new JobDetail(“myJob”, “A”, RemindJob.class);
3. Quartz之触发器
触发器:
在特定的时间触发任务的执行。SimpleTrigger是Trigger的子类
//Quartz的测试类
public class TestQuartz {
public static void main(String [] args) throws SchedulerException, InterruptedException {
//1、创建Job任务, 第一个参数是Job的名字, 第二个参数是Job的所属分组 第三个是具体Job的class
JobDetail job = new JobDetail("myJob", "A", RemindJob.class);
//2、创建触发器Trigger。 REPEAT_INDEFINITELY 表示无限期重复. 重复间隔时间为3秒
SimpleTrigger simTrig = new SimpleTrigger("trigRemindJob", SimpleTrigger.REPEAT_INDEFINITELY, 3000);
//设置触发器在当前时间的下一秒开始。
simTrig.setStartTime(new Date(System.currentTimeMillis()+ 1000));
//3、创建调度器
//3.1 创建scheduler工厂SchedulerFactory的实例对象
SchedulerFactory factory = new StdSchedulerFactory();
//3.2 通过scheduler工厂对象获取调度器
Scheduler scheduler = factory.getScheduler();
//4、将任务与触发器进行粘合
scheduler.scheduleJob(job,simTrig);
//5、启动调度器。
scheduler.start();
Thread.sleep(2000); //休眠2秒
//6、停止调度器
scheduler.shutdown();
}
}
4. Quartz之调度器
1) 调度器:任务的实际执行者,负责粘合任务和触发器。
2) 通过JobDetail创建一个任务实例。
3) 使用SimpleTrigger创建一个触发器。
4) 创建一个调度器。
//3、创建调度器
//3.1 创建scheduler工厂SchedulerFactory的实例对象
SchedulerFactory factory = new StdSchedulerFactory();
//3.2 通过scheduler工厂对象获取调度器
Scheduler scheduler = factory.getScheduler();
5) 注册任务和触发器。
//4、将任务与触发器进行粘合
scheduler.scheduleJob(job,simTrig);
6) 启动和关闭调度。
//
>5、启动调度器。
scheduler.start();
Thread.sleep(2000); //休眠2秒
完整代码如下所示
```java
//Quartz的测试类
public class TestQuartz {
public static void main(String [] args) throws SchedulerException, InterruptedException {
//3、创建调度器
//3.1 创建scheduler工厂SchedulerFactory的实例对象
SchedulerFactory factory = new StdSchedulerFactory();
//3.2 通过scheduler工厂对象获取调度器
Scheduler scheduler = factory.getScheduler();
//4、将任务与触发器进行粘合
scheduler.scheduleJob(job,simTrig);
//5、启动调度器。
scheduler.start();
Thread.sleep(2000); //休眠2秒
//6、停止调度器
scheduler.shutdown();
}
}
5. Quartz之CronTrigger
CronTrigger是Trigger的子类。
触发器 应用场景 使用方式
SimpleTrigger 固定时间间隔的调度任务(例如:每2小时执行1次任务) 通过设置触发器的属性:开始时间、结束时间、重复次数、重复间隔等。
CronTrigger 指定时间点的调度任务(例如:每天凌晨1:00执行1次) 通过定义Cron表达式
创建CronTrigger实例的代码。
CronTrigger cronTrigger = new CronTrigger(“myTrigger”,”group”,”* 35 15 ? * * ”);
测试代码如上所示。
//Quartz的测试类
public class TestQuartz {
public static void main(String [] args) throws SchedulerException, InterruptedException, ParseException {
//1、创建Job任务, 第一个参数是Job的名字, 第二个参数是Job的所属分组 第三个是具体Job的class
JobDetail job = new JobDetail("myJob", "A", RemindJob.class);
//2、创建CronTrigger实例对象,每天的10点26分执行JOB任务。
CronTrigger cronTrigger = new CronTrigger("myCronTrigger","B","0 26 10 ? * * ");
//3、创建调度器
//3.1 创建scheduler工厂SchedulerFactory的实例对象
SchedulerFactory factory = new StdSchedulerFactory();
//3.2 通过scheduler工厂对象获取调度器
Scheduler scheduler = factory.getScheduler();
//4、将任务与触发器进行粘合
scheduler.scheduleJob(job,cronTrigger);
//5、启动调度器。
scheduler.start();
Thread.sleep(2000000); //休眠2秒
//6、停止调度器
scheduler.shutdown();
}
}
6. Cron表达式
- Cron表达式由6~7个由空格分隔的时间元素组成,第7个元素可选)
简写:秒 分 时 日 月 周 年。
测试关键代码。
CronTrigger cronTrigger = new CronTrigger(“myCronTrigger”,“B”,"0 54 10 * * ? ");
- Cron表达式有几个特殊的字符,说明如下。
- “*”:表示每一个值,它可以用于所有字段。
- “?”:该字符仅用于”月份中的哪一天”字段和”星期几”字段,表示不指定值。注:这两个字段不能同时使用*号或?号。 日、周字段
- “-”:中划线,表示一个范围。
下面0-10表示0秒到10秒之间。
CronTrigger cronTrigger = new CronTrigger(“myCronTrigger”,“B”,"0-10 54 10 * * ? ");
2.1 “,”:使用逗号间隔的数据,表示一个列表。
下面55,57,59 代表55秒、57秒、59秒的时候执行Job任务。
CronTrigger cronTrigger = new CronTrigger(“myCronTrigger”,“B”,"55,57,59 54 10 * * ? ");
3.1 “/”:通常表示为x/y,x为起始值,y表示值的增量。
下面0/10,指从0秒开始,之后每10秒执行一次。
CronTrigger cronTrigger = new CronTrigger(“myCronTrigger”,“B”,"0/10 54 10 * * ? ");
7. Cron表达式示例
简写:秒 分 时 日 月 周 年。