带你一同盘点一下常用的任务调度框架的方案和开发指南
- 任务调度
- JDK原生任务调度
- Java.Util — Timer(单线程)/ TimerTask(任务调度)
- Java.Util.Concurrent — 任务调度线程池
- Spring任务调度机制
- Quartz任务调度机制
- 简单的使用流程
- Trigger触发器
- Calendar时期组件
- JobListener工作监听器
- JobStore工作存储
- 配置文件
- 集群Cluster
- 运行流程
- XXL-JOB任务调度框架
- 解决Quartz的不足
- XXLJOB的特点分析
- XXLJOB的模块
- 执行器中任务阻塞的处理:
- Elastic-JOB任务调度框架
- ElasticJob的基本原理
- ElasticJob的特点
- ElasticJob的应用场景
- ElasticJob的使用方法
- ElasticJob的特点与其他调度框架的区别
- 阿里的闭源任务调度— SchedulerX
- SchedulerX的特点
- SchedulerX的应用场景
- SchedulerX的使用方法
- 最后总结
任务调度
Java是一种广泛使用的编程语言,它提供了许多强大的工具和框架来帮助开发人员更好地管理和分配任务。其中,任务调度技术是Java中非常重要的一部分。在本文中,我们将介绍Java中的任务调度技术的基本原理、应用场景以及常见的任务调度工具。
对此本人整理了较为常用的任务调度框架或者服务的一个总览图,看看是否也有你们公司正在使用的?如下所示:
JDK原生任务调度
Java的原生的任务调的框架技术,主要有JUC和JU两个部分的实现基础底座。
Java.Util — Timer(单线程)/ TimerTask(任务调度)
JDK原生任务调度的原生任务调度框架主要是基于Java的定时器(Timer)和定时任务(ScheduledTask)机制。定时器是Java中用于执行定时任务的工具,它可以在指定的时间间隔内执行任务。定时任务是Java中用于执行周期性任务的工具,它可以在指定的时间间隔内重复执行任务。Java中的任务调度技术可以根据任务的优先级、资源的可用性和其他因素来决定任务的执行顺序和时间。
Java.Util.Concurrent — 任务调度线程池
我们都知道当线程执行的时间超过了调度间隔的时候,会存在问题和bug,因此Java又出台了另外一个任务调度组件ScheduledExecutorService(多线程)调度机制。
而我们常常使用的就是ScheduledThreadPoolExecutor,它实现了ScheduledExecutorService,它采用了阻塞队列(BlockedQueue)模式实现的延迟队列,越早执行的任务越在队头,从队头开始判断任务的执行时间是不是到了。
Spring任务调度机制
Spring Task是Spring框架中的一个任务调度工具,它可以与Spring框架无缝集成,提供了许多强大的功能,包括任务调度、任务执行、任务监控和任务管理等。
由于Spring对任务调度做了非常高度的封装,因此我们只需要使用@Scheduled就可以定义对应的任务调度任务,基于ScheduledThreadPoolExecutor。具体的实现方案,我就不在本节内容进行介绍和说明,后面会专门出文章进行详细分析和介绍。
Quartz任务调度机制
Java中的任务调度技术可以应用于各种类型的系统,包括Web应用程序、桌面应用程序和移动应用程序等。在Web应用程序中,任务调度技术可以用于管理后台任务、数据备份和数据清理等。在桌面应用程序中,任务调度技术可以用于管理自动更新和数据同步等。在移动应用程序中,任务调度技术可以用于管理后台任务和数据同步等。
除了上面介绍的Java中有许多常见的任务调度工具,其中最流行的是Quartz。Quartz是一个开源的任务调度框架,它提供了许多强大的功能,包括任务调度、任务执行、任务监控和任务管理等。
我们可以从以上几个内容对Quartz任务调度框架进行分析和介绍:
简单的使用流程
- Quartz的门面是调度器-Scheduler,它根据Trigger(触发器)生成对应的JobDetail(作业)。
- Trigger(触发器):代表和控制着Job任务作业什么时候出发,延迟多长时间开始执行,每隔多长时间执行一次。
- JobDetail(作业任务):主要代表着对应的真正执行任务逻辑和运算流程,每一个Job任务都必须要有对应的name名称和分组group。
一个JobDetail可对应多个Trigger触发器。
Trigger触发器
-
SimpleTrigger:从某个时间点开始,每隔多长时间触发,单位ms。如:1s后开始,每隔1s执行1次。
-
CalendarIntervalTrigger:从某个时间点开始,每隔多长时间触发,单位年、月、周、日、时、分、秒都可以。如:1s后开始,每个月执行1次。
-
DailyTimeIntervalTrigger:每天,从某个时间点到某个时间点,每隔多长时
间触发,触发几次,周几到周几触发。如:周一至周五,每天8点到12点,每隔1小时执行1次。 -
CronTrigger:根据Cron表达式触发。
-
NthIncludedDayTrigger:每隔多少时间的第几天执行。如:每个月的第15天执行1次。
Calendar时期组件
Scheduler可以addCalendar,加入各种Calendar来排除执行,也就是什么时间不执行。如:AnnualCalendar、MonthlyCalendar、WeeklyCalendarCronCalendar、DailyCalendar、HolidayCalendar。对应每年、每月、每周、每天什么时候不执行、假期包括哪些。
JobListener工作监听器
scheduler.getListenerManager().addListener
可以在获取Job名称后、被执行前、被拒绝后、执行结束后执行自定义的逻辑。
JobStore工作存储
Map、Set、List这些数据结构存储Job、Trigger、Calendar。
- RAMJobStore:内存存储。
- JDBCJobStore,数据库存储,官方提供了各种数据库下对应的sql文件,里面就是建表语句。
配置文件
spring_quartz.xml或者quartz.properties
集群Cluster
各节点配置同一个数据库作为JobStore,配置节点名称,打开集群开关。用select … for update抢到数据库的锁,获得触发任务执行的能力,保证不会重复执行任务。
运行流程
- QuartzSchedulerThread获取下一个即将触发的Trigger。
- 将Trigger和Job包装成JobRunShell。
- 用一个WorkerThread执行JobRunShell。
- 调用到Job的execute方法。
具体的源码暂时不进行详细介绍,后面会有专属章节进行分析和说明。
XXL-JOB任务调度框架
解决Quartz的不足
- 调度和任务耦合
- 随机负载
- 界面,动态调度
- 日志、监控、统计
XXLJOB的特点分析
- 性能:支持更多任务;更快。
- 可靠性:解决任务超时、任务失败、故障转移。
- 运维:界面、日志、报表、告警、权限。
XXLJOB的模块
XXLJOB主要有3个部分构成:
- core:核心执行包
- admin(管理任务调度线程)
- executor(管理任务执行线程)
执行器中任务阻塞的处理:
针对任务调度执行的时间超过了间隔时间的处理方式。
- 单机串行(默认):新的任务排在原有的后面。
- 丢弃后续调度:有正在执行的任务,就丢弃新来的任务,并标记为失败。
- 覆盖之前调度:终止正在执行的任务,清空队列,运行本次任务。
Elastic-JOB任务调度框架
ElasticJob是一个分布式任务调度框架,它可以帮助开发人员快速实现分布式任务调度功能。本文将介绍ElasticJob的相关技术。
ElasticJob是一个功能强大的分布式任务调度框架,它可以帮助开发人员快速实现分布式任务调度功能。ElasticJob具有分布式任务调度、弹性扩容、失败转移、任务监控和多种任务类型等特点,适用于定时任务、数据处理和分布式计算等场景。开发人员可以通过引入依赖、配置任务、编写任务逻辑和启动任务等步骤来使用ElasticJob。
ElasticJob的基本原理
ElasticJob是一个基于Java开发的分布式任务调度框架,它可以帮助开发人员快速实现分布式任务调度功能。ElasticJob提供了两种任务调度方式:SimpleJob和DataflowJob。SimpleJob适用于简单的定时任务,而DataflowJob适用于数据处理任务。
ElasticJob的核心组件包括Job Scheduler、Job Facade、Job Registry、Job Executor和Job Core等。其中,Job Scheduler负责任务的调度,Job Facade提供了任务的管理接口,Job Registry负责任务的注册和发现,Job Executor负责任务的执行,Job Core负责任务的核心逻辑。
ElasticJob的特点
-
分布式任务调度:ElasticJob支持分布式任务调度,可以将任务分配到不同的节点上执行,提高任务的执行效率和可靠性。
-
弹性扩容:ElasticJob支持弹性扩容,可以根据任务的负载情况自动增加或减少节点,提高任务的可扩展性和灵活性。
-
失败转移:ElasticJob支持任务失败转移,可以将失败的任务转移到其他节点上执行,保证任务的可靠性和稳定性。
-
任务监控:ElasticJob提供了丰富的任务监控功能,可以实时监控任务的执行情况和节点的状态,方便开发人员进行故障排查和性能优化。
-
多种任务类型:ElasticJob支持多种任务类型,包括SimpleJob和DataflowJob,可以满足不同场景下的任务需求。
ElasticJob的应用场景
-
定时任务:ElasticJob可以用于定时任务的调度,例如定时生成报表、定时发送邮件等。
-
数据处理:ElasticJob可以用于数据处理任务的调度,例如数据清洗、数据同步等。
-
分布式计算:ElasticJob可以用于分布式计算任务的调度,例如MapReduce计算、Spark计算等。
ElasticJob的使用方法
-
引入依赖:在项目的pom.xml文件中添加ElasticJob的依赖。
-
配置任务:在项目的配置文件中配置任务的相关信息,例如任务名称、任务类型、任务参数等。
-
编写任务逻辑:根据任务类型编写任务的逻辑代码,例如SimpleJob的execute方法或DataflowJob的fetchData和processData方法。
-
启动任务:在项目中启动任务,ElasticJob会自动进行任务的注册和发现,并根据任务的负载情况进行任务的调度和执行。
ElasticJob的特点与其他调度框架的区别
- Elastic-Job用Zookeeper。Quartz和XXL-Job用排它锁。
- Elastic-Job和XXL-Job支持集群、任务分片、管理界面。
- Elastic-Job是Apache孵化,XXL-Job是个人开发。
阿里的闭源任务调度— SchedulerX
SchedulerX是一个分布式任务调度平台,它可以帮助企业快速实现任务调度和管理。SchedulerX提供了多种任务调度方式,包括定时任务、消息队列任务、HTTP任务等。SchedulerX还提供了丰富的任务监控和报警功能,可以实时监控任务的执行情况和节点的状态,方便开发人员进行故障排查和性能优化。
SchedulerX的特点
-
分布式任务调度:SchedulerX支持分布式任务调度,可以将任务分配到不同的节点上执行,提高任务的执行效率和可靠性。
-
多种任务类型:SchedulerX支持多种任务类型,包括定时任务、消息队列任务、HTTP任务等,可以满足不同场景下的任务需求。
-
弹性扩容:SchedulerX支持弹性扩容,可以根据任务的负载情况自动增加或减少节点,提高任务的可扩展性和灵活性。
-
失败转移:SchedulerX支持任务失败转移,可以将失败的任务转移到其他节点上执行,保证任务的可靠性和稳定性。
-
任务监控:SchedulerX提供了丰富的任务监控功能,可以实时监控任务的执行情况和节点的状态,方便开发人员进行故障排查和性能优化。
-
报警功能:SchedulerX提供了报警功能,可以在任务执行异常或节点状态异常时发送报警信息,帮助开发人员及时处理问题。
SchedulerX的应用场景
-
定时任务:SchedulerX可以用于定时任务的调度,例如定时生成报表、定时发送邮件等。
-
消息队列任务:SchedulerX可以用于消息队列任务的调度,例如消费Kafka消息、消费RocketMQ消息等。
-
HTTP任务:SchedulerX可以用于HTTP任务的调度,例如调用API接口、爬取网页数据等。
SchedulerX的使用方法
-
部署节点:在服务器上部署SchedulerX节点,可以使用Docker或手动部署。
-
创建任务:在SchedulerX控制台上创建任务,包括任务名称、任务类型、任务参数等。
-
编写任务逻辑:根据任务类型编写任务的逻辑代码,例如定时任务的execute方法或消息队列任务的consume方法。
-
启动任务:在SchedulerX控制台上启动任务,SchedulerX会自动进行任务的注册和发现,并根据任务的负载情况进行任务的调度和执行。
最后总结
总之,Java中的任务调度技术是非常重要的一部分,它可以帮助开发人员更好地管理和分配任务,从而提高系统的效率和可靠性。Java中有许多常见的任务调度工具,开发人员可以根据自己的需求选择适合自己的工具。