一、导论
在日常的开发工作中我们经常会遇到定时任务的相关问题,比如:
- 信用卡定时每月给用户推送账单数据;
- 轮训更新某个任务的状态是否完成;
- 设置一个定时提醒;
- 邮件或消息设置定时发送;
- 定时统计某个时间段的数据存入缓存;
等等,定时可以算一个最常用的开发工作,你日常的工作中肯定也写了不少的定时任务代码,但是你真的了解定时任务吗?
下面让我们一起进入定时任务的学习!
二、基础
1. Cron表达式
参见第二篇《关于定时任务,看着一系列就够了——2.Cron表达式》
cron是当前做定时任务的基础,即使很多人说cron表达式不容易理解,但这是现在阶段所有程序编写定时任务的基础和唯一选择。就算做不到熟练编写,也应该做到看到能懂;
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义;
例如:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
2. 定时任务的三大组成部分:
调度器Scheduler、执行器 executors、触发器 Trigger
不管你使用的什么框架、用的是什么系统,或者将来又出现什么新的定时任务技术,都离不开这三部分。
我们以一个闹钟响铃的任务为例:
执行器executors:发出一阵刺耳的声音;(具体的执行操作)
触发器Trigger:发出声音的具体时间; (触发任务执行的规则,多为时间规则。)
调度器Scheduler:一直运行到触发时间点发出刺耳的声音;(进行任务的调度)
所以,当接手一个新的定时任务的框架,首先要看其这三部分是这么去实现的;
三、常用案例
后面的章节我会把软件开发项目中常用的定时任务,一一进行介绍,初步计划有
- Liunx 定时任务
- Windows 定时任务
- 时间轮(待更新)
- JDK 线程+sleep 实现定时任务
- JDK Timer & TimerTask 实习定时任务
- JDK ScheduledExecutorService
- Spring Task中的 @schedule
- Quartz
- Elastic-Job
- XXL-JOB
- PowerJob
- 消息队列实现定时任务
- redis实现定时任务
- JavaScript前端定时任务
后面会对以上的定时任务使用场景、易用性、优势劣势进行比较。方便大家有选择性的学习。