crontab
定时任务
Cron表达式
共七位,最少六位,表示如下,其中对英文缩写、特殊字符大小写不敏感
* | * | * | * | * | * | * |
---|---|---|---|---|---|---|
秒 | 分 | 时 | 日 | 月 | 周 | 年 |
0-59 | 0-59 | 0-23 | 1-31 | 1-12/JAN-DEC | 0-7/MON-SAT | 1900 可选 |
, - * / |
, - * / |
, - * / |
, - * ? / L W C |
, - * / |
, - * ? / L C # |
, - * / |
符号表示如下:
符号 | 说明 |
---|---|
* |
重复当前位置的周期,如1 * * * * ? 表示每分钟的第一秒执行 |
, |
用于指定多个值,如0 10,20,30 * * * ? 表示每小时的10、20、30分执行 |
? |
占位符 |
- |
表示区间 |
/ |
a/b表示以 a 为起点步长为 b 的时间序列,如5/10 * * * * ? 表示每分钟第5、15、25、35、45、55秒执行 |
L |
月份最后一天或星期六,周位上 6L 表示月份的最后一个周五执行,L和 W 可以在日位中联合使用,LW 表示这个月最后一周的工作日 |
W |
后边最近的工作日,1W 1日如果是周五,那就在4日执行,不可跨月,L和 W 可以在日位中联合使用,LW 表示这个月最后一周的工作日 |
# |
a#b 表示当月第 b 个星期 a,如 6#1 当月第一个星期五 |
C |
关联日历计算结果 |
场景示例
1.Mac设置定时任务
1 | # 确保存在文件 /etc/crontab,若没有则新建 |
我用terminal-notifier
来实现terminal推送提醒功能,脚本如下:
1 | # 每日凌晨更新homebrew |
2.Java中的定时任务需求
2.1 java.util.Timer (since JDK1.3)
执行时单线程,当抛出运行时异常时Timer 将停止所有的任务执行,会影响其他任务
1 | public void demo() { |
2.2 java.util.concurrent.ScheduledExecutorService (since JDK1.5)
不影响其他任务
1 | public void demo() { |
2.3 @Scheduled (based on Spring)
Spring自动加载和管理该定时任务
1 | @SpringBootApplication |
2.4 任务调度框架Quartz
在项目中使用需要引入quartz依赖,并且quartz有其独立的数据库,来支撑复杂的任务调度,详见官方文档