Java 定时任务简介

2021-11-20 From 程序之心 By 丁仪
<p> 定时任务属于常用需求,常见的比如数据定时上传超时自动处理等。在 Java 应用中可以使用 Java 自带的 Timer、线程池 ScheduledExecutorService、Quartz、Springboot 定时任务或者分布式定时任务来实现定时任务。 p>

Java 定时器 Timer

<p> Timer 是 JDK 自带的定时任务执行类,无论任何项目都可以直接使用 Timer 来实现定时任务,所以 Timer 的优点就是使用方便。Timer 类实现定时任务虽然方便,但在使用需要注意以下问题 p>

线程池 ScheduledExecutorService

<p> ScheduledExecutorService 是 JDK 自带的线程池。与 timer 相比,任务执行时长不会影响其他任务,任务异常也不会对其他任务有影响。 p>

Quartz 作业调度

<p> Quartz是一个完全由java编写的开源作业调度框架。作为一个优秀的开源调度框架,Quartz 具有以下特点: p> <p> 在 Quartz 中,主要有两种类型的任务:无状态的(stateless)和有状态的(stateful)。有状态的任务不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行p>

Springboot 定时任务

<p> 对于需要在特定时间,比如每周一、小时整点等,执行的任务,可以使用 Springboot 自带的定时任务来实现实现定时任务只需两步:开启定时任务、添加定时任务。 p> <p> 开启定时任务是在 Application 增加 @EnableScheduling 注解添加定时任务是在执行方法上增加 @Scheduled 注解,并指定执行时间时间格式cron 表达式(参考《Linux Cron 定时任务》)。如果有多个定时任务可以创建多个 @Scheduled 注解标注的方法p>

分布式定时任务

<p> 分布式环境可以使用 Redis 来实现定时任务。使用 Redis 实现延迟任务的方法大体可分为两类:通过 ZSet 的方式和键空间通知的方式p> <p> 通过 ZSet 实现定时任务的思路是,将定时任务存放到 ZSet 集合中,并且将过期时间存储到 ZSet 的 Score 字段中,然后通过一个无线循环来判断当前时间是否需要执行的定时任务,如果有则进行执行p> <p>空间通知来实现定时任务的思路是给所有的定时任务设置一个过期时间,等到了过期之后,我们通过订阅过期消息就能感知到定时任务需要执行了,此时我们执行定时任务即可默认情况下 Redis 是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启。 p>

本文来源:程序之心,转载请注明出处!

本文地址:https://chengxuzhixin.com/blog/article/303327.html

发表感想

© 2016 - 2022 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号