我们知道目前java主流的三大定时任务框架有:Quartz、xxl-job、elastic-job。
Quartz
Spring Boot中的定时器Quartz是一种基于Java的开源调度框架,可以用于在指定时间执行任务或在指定时间间隔内重复执行任务。
它提供了丰富的API和灵活的配置选项,可以满足各种不同的调度需求。在Spring Boot中,可以通过简单的配置和注解来使用Quartz定时器,使得任务调度变得更加简单和方便。
xxl-job
xxl-job是一个国内开源的分布式任务调度平台,提供了任务调度、任务执行、任务监控、报警等功能,支持分布式部署,适用于大规模分布式任务调度场景。
elastic-job
elastic-job是一个国内开源的分布式任务调度框架,提供了分布式任务调度、分布式数据流处理、分布式数据分片等功能,支持多种任务类型,适用于大规模分布式任务调度和数据处理场景。
三者各自的优缺点是什么?
Quartz
优点:支持集群部署
缺点:没有自带的管理界面;调度逻辑和执行任务耦合在一起;维护需要重启服务
总结:针对目前项目情况,利弊相同
xxl-job
优点:支持集群部署;提供运维界面维护成本小;自带错误预警;相对elastic-job来说不需要额外的组件(zookeeper);支持调度策略;支持分片;故障转移 ;更适合分布式
缺点:相对Quartz来说需要多部署调度中心
总结:针对目前项目情况,利大于弊
elastic-job
优点:支持集群部署;维护成本小
缺点:elastic-job需要zookeeper,zookeeper集群高可用至少需要三台服务器
总结:针对目前项目情况,弊大于利
就目前三大定时任务框架的缺点和目前项目的状况而言,还是建议选用xxl-job。
下面重点聊一下xxl-job。
xxl-job结构图:
xxl-job的组成角色:
调度中心 : 将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求
执行器(触发器): 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑
任务: 具体执行的逻辑代码
“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性。
xxl-job框架的使用步骤:
xxl-job的一些特点:
动态:支持动态修改任务状态、启动 / 停止任务,以及终止运行中任务,即时生效;
弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性 HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
任务进度监控:支持实时监控任务进度;
运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
线程池隔离:调度线程池进行隔离拆分,慢任务自动降级进入 “Slow” 线程池,避免耗尽调度线程,提高系统稳定性;
全异步:任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰,理论上支持任意时长任务的运行