定时任务
实现方式一:Timer
schedule 示例清单
|
|
特性:任务由同一个线程调度,串行执行。下一个任务按照前一个任务的实际执行完成的时间起算向后推一个时间间隔的时长,若前一个任务发生延迟,下一个任务也会被延后执行。不存在线程安全问题。
scheduleAtFixedRate 示例清单
|
|
特性:下一个任务按照前一个任务开始执行的时间开始计算,若前一个任务发生延迟,下一个任务不会被延后,存在并发性的可能性,需要考虑线程安全问题。
实现方式二:ScheduledExecutorService
scheduleWithFixedDelay 示例清单
|
|
newSingleThreadScheduledExecutor() 等效于 Executors.newScheduledThreadPool(1)。
特性:下一个任务按照前一个任务的实际执行完成的时间起算向后推一个时间间隔的时长,若前一个任务发生延迟,下一个任务也会被延后执行。是基于不固定时间间隔进行的任务调度。
scheduleAtFixedRate 示例清单
|
|
newSingleThreadScheduledExecutor() 等效于 Executors.newScheduledThreadPool(1)。
特性:下一个任务按照前一个任务开始执行的时间开始计算,若前一个任务发生延迟,下一个任务不会被延后,是基于固定时间间隔进行的任务调度。
借助 Calendar 实现复杂的任务调度
|
|
实现方式三:Quartz
Cron 触发器
表达式格式:秒 分 时 日 月 周 年 [ 可选 ]
字段名 | 值范围 | 特殊字符 |
---|---|---|
秒 | 0 - 59 | , - * / |
分 | 0 - 59 | , - * / |
时 | 0 - 23 | , - * / |
日 | 0 - 31 | , - * / L W C ? |
月 | 1 - 12 [ JAN - DEC ] | , - * / |
周 | 1 - 7 [ SUN - SAT ] | , - * / L C # ? |
年 | 1970 - 2099 | , - * / |
特殊字符 | 含义描述 |
---|---|
, | 用于指定多个值。如在周字段中,MON, WED, FRI 表示一三五 |
- | 用于指定一个范围的值。如在时字段中,03-04 表示凌晨 3 至 4 点 |
* | 表示任意值 |
/ | 表示增量值。如在分字段中,5/30 表示从第 5 分钟起,每 30 分钟一次 |
# | 只用于周字段,表示月的第几周,如 MON#2 表示该月的第二个星期一 |
? | 表示不确定值,是什么值不重要。 |
C | Calendar 的缩写,表示基于日历计算出来的值。 |
L | Last 的缩写,在日字段中单独出现,表示该月最后一天; 在周字段中单独出现表示 7 或 SAT,组合出现,如 7L,表示该月最后一个周六 |
W | 表示工作日(周一 至 周五) |
示例 | 描述 |
---|---|
0 0 3 * * * | 每天凌晨 3 点触发 |
0 0 3 * * ? | 每天凌晨 3 点触发 |
0 0 3 * * ? * | 每天凌晨 3 点触发 |
0 * 3 * * ? | 每天凌晨 3 点 至 3 点 59 分,每分钟触发一次 |
0 */5 * * * ? | 每隔 5 分钟触发一次 |
0 */5 3 * * ? | 每天凌晨 3 点 至 3 点 59 分,每 5 分钟触发一次 |
0 0 3-4 * * ? | 每天凌晨 3 至 4 点,每小时触发一次 |
0 0 3 * * MON,WED,FRI | 每个周一、周三、周五的凌晨 3 点触发一次 |
0 0 3 L * ? | 每个月的最后一天凌晨 3 点触发 |
0 0 3 * * 2L | 每个月的最后一个周一的凌晨 3 点触发 |
0 0 3 * * MON#2 | 每个月的第二个周一的凌晨 3 点触发 |
示例清单
|
|
pom.xml
|
|
log4j.xml
|
|
与 spring 整合
整合示例清单
|
|
pom.xml
|
|
beans.xml
|
|
log4j.xml
|
|
测试清单
|
|