一、分布式调度参数传递和调度日志配置
简单获取参数
String jobParam = XxlJobHelper.getJobParam(); log.info("dbc方法调用成功——"+ jobParam);
日志打印操作
XxlJobHelper.log("这个是执行日志:param="+jobParam);
执行结果修改
设置任务结果为失败
XxlJobHelper.handleFail("任务执行失败!");
设置任务结果为成功
XxlJobHelper.handleSuccess("任务执行成功!");
二、【高级】XXL-Job集群部署和高可用案例配置
简单画了个高可用集群部署[aru_36]
上代码
#调度中心部署地址,多个配置逗号分隔 "http://address01,http://address02" xxl.job.admin.addresses=http://127.0.0.1:8081/xxl-job-admin,http://127.0.0.1:8082/xxl-job-admin
三、【高级】XXL-Job海量数据处理-分片任务实战
- 需求
- 有一个任务需要处理100W条数据,每条数据的业务逻辑处理要0.1s
- 对于普通任务来说,只有一个线程来处理 可能需要10万秒才能处理完,业务则严重受影响
- 案例:双十一大促,给1000万用户发营销短信
- 什么是分片任务
- 执行器集群部署,如果任务的路由策略选择【分片广播】,一次任务调度将会【广播触发】对应集群中所有执行器执行一次任务,同时系统自动传递分片参数,执行器可根据分片参数开发分片任务
- 需要处理的海量数据,以执行器为划分,每个执行器分配一定的任务数,并行执行
- XXL-Job支持动态扩容执行器集群,从而动态增加分片数量,到达更快处理任务
- 分片的值是调度中心分配的
- 解决思路
- 如果将100W数据均匀分给集群里的10台机器同时处理,
- 每台机器耗时,1万秒即可,耗时会大大缩短,也能充分利用集群资源
- 在xxl-job里,可以配置执行器集群有10个机器,那么分片总数是10,分片序号0~9 分别对应那10台机器。
- 分片方式
- id % 分片总数 余数是0 的,在第1个执行器上执行
- id % 分片总数 余数是1 的,在第2个执行器上执行
- id % 分片总数 余数是2 的,在第3个执行器上执行
- ...
- id % 分片总数 余数是9 的,在第10个执行器上执行
代码实战
@XxlJob(value = "shardingJobHandler") public void shardingJobHandler(){ // 当前的执行器编号 int shardIndex = XxlJobHelper.getShardIndex(); // 总的分片数,就是执行器的集群数量 int shardTotal = XxlJobHelper.getShardTotal(); log.info("分片总数:{},当前分片数{}",shardTotal,shardIndex); List<Integer> allUserIds = getAllUserIds(); allUserIds.forEach(obj->{ if (obj % shardTotal == shardIndex){ log.info("第{}片,命中分片开始处理用户id={}",shardIndex,obj); } }); } private List<Integer> getAllUserIds(){ List<Integer> ids = new ArrayList<>(); for (int i=0;i<100;i++){ ids.add(i); } return ids; }
本文作者为DBC,转载请注明。