任务调度、Quartz任务调度 、了解Quartz框架、什么是任务调度
任务调度:根据时间,执行任务。
生活案例:
- 比如生活中的闹钟,我们设置闹钟每天早上七点执行响铃操作。我们给这个闹钟设定了时间,并且也给它设置了要进行执行的具体任务。关于这样的业务我们就称之为任务调度。
- 在爱旅行项目中,就引用任务调度这么一个功能。比如说,当用户在预订完酒店后,如果在两个小时内没有支付,那么就自动会被取消掉。关于这样的功能我们如何去解决呢?
解决方案:
每十分钟扫描一下订单,来看一下订单库中有没有超过两个小时还没有支付的订单, 如果有的话就把订单给取消掉。这样的一个功能,它也有两个关键点,一个是每十分钟 执行一次。第二个关键点是具体要执行的任务是:对于那些超过两个小时还没有支付 的订单查询出来,然后进行一个取消的操作。那么具体如何实现呢?就要学习一下 Quartz框架。
- 1 Quartz框架
官网: http://www.quartz-scheduler.org
核心概念:任务(Job)、触发器(Trigger)、调度器(Scheduler)
1.2 Quartz工作原理
- 任务:需要执行的具体工作。
- 触发器:在特定的时间触发任务的执行。
- 调度器:任务的实际执行者,负责粘合任务和触发器。
1.3 使用Quartz框架编写定时任务
Quartz环境初始化
- 创建一个普通的Maven项目,包名cn.quartz 项目名TestQuartz。
- 将Quartz所需要的Maven依赖进行添加。
|
- 4 Quartz之任务
任务:需要执行的具体工作。
|
上面是Job类中的业务代码,在业务代码编写完后,要具体如何去调用这个Job呢?这就需要创建JobDetail实例对象。
|
- 5 Quartz之触发器
触发器:在特定的时间触发任务的执行。
SimpleTrigger是Trigger的子类。
|
1. 6 Quartz之调度器
- 调度器:任务的实际执行者,负责粘合任务和触发器。
- 通过JobDetail创建一个任务实例。
- 使用SimpleTrigger创建一个触发器。
- 创建一个调度器。
|
- 注册任务和触发器。
|
2. 启动和关闭调度。
|
完整代码如下所示。
|
启动运行。
- 7 Quartz之CronTrigger
CronTrigger是Trigger的子类。
触发器 | 应用场景 | 使用方式 |
SimpleTrigger | 固定时间间隔的调度任务(例如:每2小时执行1次任务) | 通过设置触发器的属性:开始时间、结束时间、重复次数、重复间隔等。 |
CronTrigger | 指定时间点的调度任务(例如:每天凌晨1:00执行1次) | 通过定义Cron表达式 |
创建CronTrigger实例的代码。
|
测试代码如上所示。
|
- 8 Cron表达式
- Cron表达式由6~7个由空格分隔的时间元素组成,第7个元素可选)
位置 | 字段含义 | 范围 | 允许的特殊字符 |
1 | 秒 | 0~59 | * / |
2 | 分钟 | 0~59 | * / |
3 | 小时 | 0~23 | * / |
4 | 月份中的哪一天 | 1~31 | * / ? L |
5 | 月份 | 1~12或JAN~DES | * / |
6 | 星期几 | 1~7或SUN-SAT | * / ? L # |
7 | 年份 | 1970~2099 | * / |
简写:秒 分 时 日 月 周 年。
测试关键代码。
CronTrigger cronTrigger = new CronTrigger("myCronTrigger","B","0 54 10 * * ? "); |
- Cron表达式有几个特殊的字符,说明如下。
- “*”:表示每一个值,它可以用于所有字段。
- “?”:该字符仅用于”月份中的哪一天”字段和”星期几”字段,表示不指定值。注:这两个字段不能同时使用*号或?号。 日、周字段
- “-”:中划线,表示一个范围。
下面0-10表示0秒到10秒之间。
CronTrigger cronTrigger = new CronTrigger("myCronTrigger","B","0-10 54 10 * * ? "); |
- “,”:使用逗号间隔的数据,表示一个列表。
下面55,57,59 代表55秒、57秒、59秒的时候执行Job任务。
CronTrigger cronTrigger = new CronTrigger("myCronTrigger","B","55,57,59 54 10 * * ? "); |
- “/”:通常表示为x/y,x为起始值,y表示值的增量。
下面0/10,指从0秒开始,之后每10秒执行一次。
CronTrigger cronTrigger = new CronTrigger("myCronTrigger","B","0/10 54 10 * * ? "); |
- 10 Cron表达式示例
简写:秒 分 时 日 月 周 年。
Cron表达式 | 含义 |
0 15 4 * * ? | 每天凌晨4点15分 |
30 0 0 1 1 ? 2014 | 2014年1月1日凌晨过30秒 |
0 0 14 1,10,20 * ? * | 每月的1号、10号、20号的下午2点 |
0 0/5 15,17 * * ? | 每天15点到16点每5分钟运行一次,此外,每天17点到18点每分钟运行一次 |
- 11 使用Spring整合Quartz框架
- XML方式(了解)
- 注解方式(重点)
注:可以到App信息管理系统中去整合。
- 在Controller中指定方法上面加入@Scheduled注解
|
- 在springmvc-servlet.xml中添加task标签。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> <task:annotation-driven/> |