文章目录

  • 背景
  • 问题
  • 排查
  • 解决方式
  • 总结
  • 关于我

背景

最近需要将任务改为分布式调度,而任务调度使用的是开源的xxl-job

改为分布式调度也很简单

  1. 首先获取当前节点和总节点数量
             // 当前分片int shardIndex = XxlJobHelper.getShardIndex();// 分片总数int shardTotal = XxlJobHelper.getShardTotal();
  1. 获取业务任务取模处理
select * from test_job where mod(id, #{shardTotal}) = #{shardIndex}
  1. 修改任务路由策略为分片广播

问题

遇到的问题是docker容器中明明只是部署了两个节点,但是查看调度中心中执行器中的Online 机器地址却有四个

而且IP地址很奇怪,就是同一个ip地址注册了两个执行器,不同的是一个是9999端口,一个是10000端口。

排查

为了解决这个问题,就去github下载了和版本匹配的源码2.3版本,在本地搭建了一个简单的运行环境,然后去看这个注册节点是如何统计的。


xxl的源码比较简单,先执行需要的sql脚本,修改数据库配置然后启动xxl-job-admin

然后在启动sample-springboot这个项目。

然后通过我们分片参数获取方式作为入口,进行源码分析

        int shardIndex = XxlJobHelper.getShardIndex();


点进去会发现最终获取的是XxlJObContext 中的shardIndex属性,然后我们看看shardIndex属性是如何赋值的

这里整个链路追踪有点长。最后追到这里

EmbedServer类是继承了Netty的SimpleChannelInboundHandler。所以这里很明显shardIndex就是xxl-job-admin来的那么如果来的呢?

肯定是启动的时候调用来的,我们就从配置文件入手,一般我们配置是像这样配置一个XxlJobSpringExecutor

@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}

我们看源码会发现XxlJobSpringExecutor实现了spring的SmartInitializingSingleton接口

SmartInitializingSingleton接口的方法afterSingletonsInstantiated在bean初始化完会执行。我们看看afterSingletonsInstantiated的方法

可以看到调用了一个start()方法,我们进入start()方法会发现又调用一个initEmbedServer方法

进入方法initEmbedServer我们会发现有一个获取执行器端口的方法

我们进入获取端口的方法

会发现默认注册的端口是9999,如果端口占用了就会+1,变成10000。

这里就和我们上面类似,但是上面是注册了9999和10000端口,那么这里是不是说我们的一个执行器注册了两次呢?

然后我看我们项目中XxlJobSpringExecutor的配置

会发现指定了initMethod方法为start方法,这里会导致一个什么问题呢?
XxlJobSpringExecutor本身是实现了SmartInitializingSingleton接口
afterSingletonsInstantiated方法本身就调用了父类(XxlJobExecutor)的start方法,如果再执行initMethod指定的start,就会导致调用两次start方法(初始化bean一次,bean初始化完又调用一次),xxl 执行器就会注册两次导致执行器注册数量不对。

解决方式

这里就真相大白了,就是配置不对,需要将配置文件中的initMethod给干掉

总结

其实看源码大致就是这么一个思路,解决了一个什么问题并不重要,重要是解决问题的思路。其实我这里是有看源码看到最后如何从xxl-job-admin注册节点获取数据,无非基于自己实现的http发生了一个请求,最终写到数据库中的xxl_job_registry表中

核心源码可以截图给大家看看

找到调用url后我们直接项目中搜索registryRemove

最终也是调用dao存储

关于我

觉得文章不错请扫码关注我吧

记一次xxl-job执行器Online机器地址(注册节点)加倍问题相关推荐

  1. xxl子任务_阿里面试官:聊一下分布式任务调度有那些解决方案?

    作者:黄兆平 来源:http://blog.freshfood.cn/article/39 # 简介 随着系统规模的发展,定时任务数量日益增多,任务也变得越来越复杂,尤其是在分布式环境下,存在多个业务 ...

  2. 【分布式任务调度】(二)XXL-JOB执行器配置及定时任务的创建

    文章目录 1. 概述 2. 调度器配置 2.1.依赖及配置 2.2.任务实例 2.3.调度中心管理配置 3. 总结 1. 概述 在上一篇<XXL-JOB调度中心集群部署配置>中,我们已经得 ...

  3. xxl-job调度中心、执行器源码详解

    文章目录 简介 调度中心 一.程序启动初始化 1.初始化入口类 2.初始化I18n 3.初始化快慢调度线程池 4.初始化处理执行器注册或移除线程池+更新执行器最新在线的守护线程 5.初始化监控任务调度 ...

  4. XXL-JOB原理--执行器注册(二)

    1.xxl-job添加执行器到任务调度中心有两种方式 (1)客户端执行器自动将名称和机器地址注册到任务调度中心 (2)可以在任务调度中心手动录入执行器名称和相关的机器地址(多个机器地址用逗号隔开) 2 ...

  5. xxl-job(v2.1.0 Release)执行器端的执行器自动注册原理

    (一)xxl-job介绍以及搭建过程 (二)xxl-job执行器端的执行器自动注册原理 (三)xxl-job调度器端的执行器自动注册原理 (四)xxl-job任务管理以及调度器端任务手动执行的原理 ( ...

  6. 【分布式任务调度】(三)XXL-JOB调度中心对执行器的上下线感知实现原理

    文章目录 1. 前言 2. 调度关系 3. 执行器注册 3.1. 调度中心处理注册请求 3.2. 执行器发起注册请求 4. 执行器注销 4.1.主动注销 4.2. 被动注销 5.流程图 6. 总结 这 ...

  7. XXL-JOB - 调度中心和执行器的简单使用

    XXL-JOB - 调度中心和执行器的简单使用 XXL-JOB是什么 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线 ...

  8. 安卓app源码和设计报告——简易记账本

    课 程 设 计(实训)说 明 书 题目 实现简易记账本功能 专 业 班 级 学生姓名 同组学生 指导老师 课程设计(实训)评语 学生姓名 专业 班级 2 题目 实现简易记账本功能 评语: 成绩: 优 ...

  9. 晨曦记账本,管理收入支出

    随着人们生活水平的提高,经济收入的提高,人们也越来越关注家庭收支,管理家庭收支也是大家很关注的问题,今天小编分享一款用电脑记录收支情况的好方法. 先在电脑上下载一个晨曦记账本,第一次使用的小伙伴先注册 ...

最新文章

  1. 资本|五大科技巨头并购投资布局分析
  2. SpringMVC:学习笔记(11)——依赖注入与@Autowired
  3. 碗都交出去了,能不能分到羹?
  4. xadsafe做暗刷_手把手教你如何去掉网吧广告之网维大师_XADSAFE
  5. Percona Server for MySQL 5.5.30-30.2
  6. iOS推送群发的问题,PushSharp作者的这篇讲得最详细了
  7. 【我的物联网成长记9】物联网平台安全如何破?
  8. 企业文化用品展示网页的开发
  9. 函数的返回竟然能作为左值
  10. day_log 12月份的
  11. [News]传奇乞丐粉笔字震惊全国 字库上门求字
  12. centos进入管理员_centOS 如何让当前用户取得管理员权限
  13. 市场调研-全球与中国LED多层指示灯市场现状及未来发展趋势
  14. 计算机科学的主要研究领域是,斯坦福大学计算机科学专业研究领域有哪些?
  15. 英语语法之强调句和倒装
  16. 外贸人如何把握客户跟进频率?
  17. 功利主义穆勒思维导图_边沁与穆勒的功利主义思想之比较
  18. Linux主机和Windows主机有什么区别?
  19. [珍藏] 技能图谱握在手,召唤神龙不用愁
  20. 恶意代码分析实战Lab0701

热门文章

  1. URI URL区别及转换
  2. Matlab实现Holland风场
  3. PPT制作(文字排版)
  4. process-on在线绘制架构图,xmind绘制思维导图
  5. 根据已经commit的数据,进行leader和peon之间的同步
  6. ubuntu18.04系统外接显卡(英伟达RTX 2080 Ti)驱动安装
  7. 【中科大软院】还香不香?20软院考研四千字复盘
  8. 在国外期刊发表文章时一定用到的,SCI论文写法攻略
  9. 无损数据压缩 Lossless Compression
  10. 安装Ubuntu的时候屏幕太小看不到下一步,点不到继续按钮