Java 定时任务简介

2021-11-20 From 程序之心 By 丁仪

定时任务属于常用需求,常见的比如数据定时上传、超时自动处理等。在 Java 应用中可以使用 Java 自带的 Timer、线程池 ScheduledExecutorService、Quartz、Springboot 定时任务或者分布式定时任务来实现定时任务

Java 定时器 Timer

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

线程池 ScheduledExecutorService

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

Quartz 作业调度

Quartz是一个完全由java编写的开源作业调度框架。作为一个优秀的开源调度框架,Quartz 具有以下特点:

  • 强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
  • 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
  • 分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升;

在 Quartz 中,主要有两种类型的任务:无状态的(stateless)和有状态的(stateful)。有状态的任务不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。

Springboot 定时任务

对于需要在特定时间,比如每周一、小时整点等,执行的任务,可以使用 Springboot 自带的定时任务来实现。实现定时任务只需两步:开启定时任务、添加定时任务

开启定时任务是在 Application 增加 @EnableScheduling 注解。添加定时任务是在执行方法上增加 @Scheduled 注解,并指定执行时间,时间格式是 cron 表达式(参考《Linux Cron 定时任务》)。如果有多个定时任务可以创建多个 @Scheduled 注解标注的方法。

分布式定时任务

分布式环境可以使用 Redis 来实现定时任务。使用 Redis 实现延迟任务的方法大体可分为两类:通过 ZSet 的方式和键空间通知的方式。

通过 ZSet 实现定时任务的思路是,将定时任务存放到 ZSet 集合中,并且将过期时间存储到 ZSet 的 Score 字段中,然后通过一个无线循环来判断当前时间内是否有需要执行的定时任务,如果有则进行执行。

键空间通知来实现定时任务的思路是给所有的定时任务设置一个过期时间,等到了过期之后,我们通过订阅过期消息就能感知到定时任务需要被执行了,此时我们执行定时任务即可。默认情况下 Redis 是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启。

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

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

发表感想

© 2016 - 2022 chengxuzhixin.com All Rights Reserved.

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