什么是定时任务?定时任务如何实现?Quzrtz是什么?Elastic-Job又是什么?
本篇文章从定时任务的场景开始具体聊一聊,主要结合代码做简单的实现
文章目录
一、定时任务的出现场景
定时任务就是字面的意思,简单来说就是按照一定时间规则去执行相应的任务。
例如在我们的电商系统中,超过30分钟的订单是需要自动取消的,那么就需要定时去扫描超过30分钟的订单设置关闭状态。还有每个月的订单量是需要进行统计的,这个就需要在每月的第一天或者月初的几天对订单进行统计操作。还有一个场景,每逢过节需要向用户发放优惠券,这个也是需要提前设置好节日时间来执行相应的发放优惠券的业务。
再比如,金融系统中,每个月需要做一些报表统计工作。
这里列出几个常见的场景:
所有以上的场景中,如果都是由我们人为去触发操作是比较耗时的,这里就需要我们去写特定的程序去根据一定的时间规则去执行相应的业务。
这里的时间规则主要包括两点:
1、每隔一段时间自动触发任务(例如:每隔一天做报表统计,每隔两天做数据归档等)
2、到指定日期去触发任务(例如:每个月1号向用户发放优惠券)
那么定时任务具体如何实现呢
二、定时任务的实现方式Quzrtz
早期没有定时任务框架的时候,我们会使用JDK中的Timer机制(定时器)和多线程机制(Runnable+线程休眠)来实现定时或者间隔⼀段时间执⾏某⼀段程序。
但是Timer和多线程机制的缺点也是显而易见的:
TImer:无法管理并发任务,只是用一个线程去执行任务;在出现异常的情况下会停止所有的任务;无法处理对时效性要求高的任务等。
多线程:使用过于繁琐,编写代码过多,需要控制同步问题。
后来有了定时任务框架Quartz。当然也有很多别的定时任务框架,这里是因为Quzrtz的使用场景更多一些,大家也比较熟悉。
1.Quartz介绍
Quartz是英文石英表,也对应了他的目的,就是为了处理定时任务。
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。
那么一个定时任务如何创建呢?当然是需要一个执行器去按照相应的时间规则去执行任务。
那么执行器、执行规则、任务就对应了Quartz中的三个重要组件。
Quzrtz包含三个重要的组件:
1、Scheduler(调度器)
2、Job(任务)
3、Trigger(触发器,包括SimpleTrigger和CronTrigger)
三者关系如图:
简单来说,就是调度器按照触发器的规则去执行任务。
2.代码实现
使用Quartz只需要引入一个依赖即可
<!--任务调度框架quartz-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
那么我们就来分析一下具体的步骤:
1、创建时间触发器(任务触发执行的规则)
2、创建一个任务(做什么事)
3、创建任务调度器
4、使用任务调度器根据时间触发器执行我们的任务
2.1 cron表达式
在使用代码之前要学习一下cron表达式,cron表达式就相当于一个定时任务的时间约定。
Cron表达式由七个位置组成,空格分隔,第七位是可选项。
比如约定 每天的11点触发执行 那么cron表达式为 0 0 11 * * ?
与cron表达式类似的,在Linux操作系统中有crontab表达式,可以用于创建操作系统的定时任务。
比如每小时的第3和第15分钟执行myCommand命令
3,15 * * * * myCommand
那么cron表达式每一位表示的意义是什么呢,这里就简单介绍一下
2.2 Trigger触发器
这里触发器是通过TriggerBuilder构建器创建的,因为基于cron表达式,所以是个CronTrigger