- 将quartz动态任务配置信息持久化到数据库,将数据操作包装成基本jar包,供项目之间使用,引用项目只需要引入jar包依赖和配置对应的数据表,使用时就可以对Quartz配置透明 。
- 集群模式通过故障转移和负载均衡实现了任务的高可用性,通过数据库的锁机制来确保任务执行的唯一性,但是集群特性仅仅只是用来HA,节点数量的增加并不会提升单个任务的执行效率,不能实现水平扩展 。
- Quartz插件可以对特定需要进行扩展,比如增加触发器和任务执行日志,任务依赖串行处理场景,可参考:quartz插件——实现任务之间的串行调度
(2)调度逻辑和执行逻辑并存于同一个项目中,在机器性能固定的情况下,业务和调度之间不可避免地会相互影响 。
(3)quartz集群模式下,是通过数据库独占锁来唯一获取任务,任务执行并没有实现完善的负载均衡机制 。
2.4 轻量级神器 XXL-JOB2.4.1 基本介绍XXL-JOB是一个轻量级分布式任务调度平台,主打特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展,代码仍在持续更新中 。
“调度中心”是任务调度控制台,平台自身并不承担业务逻辑,只是负责任务的统一管理和调度执行,并且提供任务管理平台, “执行器” 负责接收“调度中心”的调度并执行,可直接部署执行器,也可以将执行器集成到现有业务项目中 。通过将任务的调度控制和任务的执行解耦,业务使用只需要关注业务逻辑的开发 。
主要提供了任务的动态配置管理、任务监控和统计报表以及调度日志几大功能模块,支持多种运行模式和路由策略,可基于对应执行器机器集群数量进行简单分片数据处理 。
2.4.2 原理解析2.1.0版本前核心调度模块都是基于quartz框架,2.1.0版本开始自研调度组件,移除quartz依赖 ,使用时间轮调度 。

文章插图
2.4.3 实践说明详细配置和介绍参考官方文档 。
2.4.3.1 demo使用:示例1:实现简单任务配置,只需要继承IJobHandler 抽象类,并声明注解
@JobHandler(value=https://www.isolves.com/it/cxkf/kj/2020-04-18/"offlineTaskJobHandler") ,实现业务逻辑即可 。(注:此次引入了dubbo,后文介绍) 。
@JobHandler(value=https://www.isolves.com/it/cxkf/kj/2020-04-18/"offlineTaskJobHandler")@Componentpublic class OfflineTaskJobHandler extends IJobHandler {@Reference(check = false,version = "cms-dev",group="cms-service")private OfflineTaskExecutorFacade offlineTaskExecutorFacade;@Overridepublic ReturnT execute(String param) throws Exception {XxlJobLogger.log(" offlineTaskJobHandler start.");try {offlineTaskExecutorFacade.executeOfflineTask();} catch (Exception e) {XxlJobLogger.log("offlineTaskJobHandler-->exception." , e);return FAIL;}XxlJobLogger.log("XXL-JOB, offlineTaskJobHandler end.");return SUCCESS;}} 示例2:分片广播任务 。@JobHandler(value=https://www.isolves.com/it/cxkf/kj/2020-04-18/"shardingJobHandler")@Servicepublic class ShardingJobHandler extends IJobHandler {@Overridepublic ReturnT execute(String param) throws Exception {// 分片参数ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());// 业务逻辑for (int i = 0; i < shardingVO.getTotal(); i++) {if (i == shardingVO.getIndex()) {XxlJobLogger.log("第 {} 片, 命中分片开始处理", i);} else {XxlJobLogger.log("第 {} 片, 忽略", i);}}return SUCCESS;}} 2.4.3.2 整合dubbo(1)引入dubbo-spring-boot-starter和业务facade jar包依赖 。<dependency><groupId>com.alibaba.spring.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.0.0</version></dependency><dependency><groupId>com.demo.service</groupId><artifactId>xxx-facade</artifactId><version>1.9-SNAPSHOT</version></dependency>(2)配置文件加入dubbo消费端配置(可根据环境定义多个配置文件,通过profile切换) 。## Dubbo 服务消费者配置spring.dubbo.Application.name=xxl-jobspring.dubbo.registry.address=zookeeper://zookeeper.xyz:2183spring.dubbo.port=20880spring.dubbo.version=demospring.dubbo.group=demo-service
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 非常重要的mysql数据库定时备份!
- |IT项目经理项目全流程工作任务解析(深刻)(1)
- 只知道HDFS和GFS?你其实并不懂分布式文件系统
- Spring Session 原理分析
- 用过Redis分布式锁,但是了解它的背后原理吗?
- 做网站优化,定时发文好呢?还是不定时发文好呢?
- 你再不知道分布式事务,我就真的生气了
- 原理篇 分布式系统中如何优雅地追踪日志
- 分布式系统ID的生成方法之UUID、数据库、算法、Redis、Leaf方案
- 分布式系统架构落地与瓶颈突破 进阶架构师必读,人人都是架构师
