XXL-JOB
- 概述
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 - 部署安装,安装上边的地址执行即可,下边部分重点解释XXL-JOB的名词概念
- 场景
每天都有短信发送任务,假设有个短信发送任务表,sms_send_tasks,里边有客户电话和短信内容,还有发送时间send_time,当send_time>now() 的时候,发送短信;发送短信数据大约1000W;(这个活我们叫做个床) -
用XXL-JOB实现;先建个执行器
-
启动业务代码,注册上 xxl-job-executor-sms-send,如下图
执行器和应用实例的关系 :新建执行器的时候,会指定个appName,这个就是用来标志执行器,应用中配置这个appName=xxl-job-executor-sms-send,那么在控制台就可以看到这个执行器下有这个应用包括ip和端口,如下
执行器下可以有多个应用服务器,把应用服务器当成工人(真正干活的),那么执行器就相当于木工这种总称;木工A,木工B……
-
因为这个家具比较大(1000W条发短信任务),一个工人(注册节点)来做要很长时间,所以我们注册两个工人,当然也可以多个,如下
- 现在就是木工团队有两个木工(http://10.110.20.170:9999/)和木工(http://10.110.20.169:9999/),我们开始让两个木工一块干活(分配任务)
-
分配任务
任务的概念,做个床,就是任务。做个床(任务)需要木工(短信发送执行器)来做;任务执行必须指定执行器,至于执行器下边有几个木工,任务不关注;
做个床这个任务,有个真正的handler,这个相当于木工的刀;做床这个任务,需要木工的刀(SendSmsShardingJobHandler)做;
我们再来梳理下木工和刀的关系,木工A(http://10.110.20.170:9999)的工具很多,刀,叉,剪子,斧子……(应用代码里的方法@XxlJob("SendSmsShardingJobHandler"))
- 然后调度中心就开始调度了。相当于有个工头要给两个木工分活,但是这个包工头(调度中心)要管的工人很多,不止是木工,还有瓦工啥的,但是他能分清楚这个活(任务)需要什么工(执行器);于是来了一任务(Cron时间),他就把活分到某个工种上边(执行器);来个个做床的任务,那么包工头(调度中心)分配给木工(短信发送执行器)
- 木工A和木工B的合作
因为木工A和B干的活是一样的(代码是相同的一块),所以要在逻辑上区分到底谁来干;
int shardIndex = XxlJobContext.getXxlJobContext().getShardIndex();//我是木工A
int shardTotal = XxlJobContext.getXxlJobContext().getShardTotal();//一共两个木工
int tId = 短信发送任务id;
XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
if(tId% shardTotal == shardIndex ){
//我们用任务取余总节点数量,看于当前节点序号是不是相同,相同的话,就说明是当前节点的任务
//这是我的任务
}
这样由木工A和木工B自己来区分是不是自己的任务,不是的就不管;