定时任务属于常用需求,常见的比如数据定时上传、超时自动处理等。在 Java 应用中可以使用 Java 自带的 Timer、线程池 ScheduledExecutorService、Quartz、Springboot 定时任务或者分布式定时任务来实现定时任务。
Timer 是 JDK 自带的定时任务执行类,无论任何项目都可以直接使用 Timer 来实现定时任务,所以 Timer 的优点就是使用方便。Timer 类实现定时任务虽然方便,但在使用时需要注意以下问题:
ScheduledExecutorService 是 JDK 自带的线程池。与 timer 相比,任务执行时长不会影响其他任务,任务异常也不会对其他任务有影响。
Quartz是一个完全由java编写的开源作业调度框架。作为一个优秀的开源调度框架,Quartz 具有以下特点:
在 Quartz 中,主要有两种类型的任务:无状态的(stateless)和有状态的(stateful)。有状态的任务不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。
对于需要在特定时间,比如每周一、小时整点等,执行的任务,可以使用 Springboot 自带的定时任务来实现。实现定时任务只需两步:开启定时任务、添加定时任务。
开启定时任务是在 Application 增加 @EnableScheduling 注解。添加定时任务是在执行方法上增加 @Scheduled 注解,并指定执行时间,时间格式是 cron 表达式(参考《Linux Cron 定时任务》)。如果有多个定时任务可以创建多个 @Scheduled 注解标注的方法。
分布式环境可以使用 Redis 来实现定时任务。使用 Redis 实现延迟任务的方法大体可分为两类:通过 ZSet 的方式和键空间通知的方式。
通过 ZSet 实现定时任务的思路是,将定时任务存放到 ZSet 集合中,并且将过期时间存储到 ZSet 的 Score 字段中,然后通过一个无线循环来判断当前时间内是否有需要执行的定时任务,如果有则进行执行。
键空间通知来实现定时任务的思路是给所有的定时任务设置一个过期时间,等到了过期之后,我们通过订阅过期消息就能感知到定时任务需要被执行了,此时我们执行定时任务即可。默认情况下 Redis 是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启。
本文来源:程序之心,转载请注明出处!
主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解程序执行的方式,改进程序的执行效率。此书以程序员的视角全面讲解了计算机系统,深入浅出地介绍了处理器、编译器、操作系统和网络环境,是这一领域的权威之作。
最新内容
© 2016 - 2023 chengxuzhixin.com All Rights Reserved.