记一次xxl-job执行器Online机器地址(注册节点)加倍问题
文章目录
- 背景
- 问题
- 排查
- 解决方式
- 总结
- 关于我
背景
最近需要将任务改为分布式调度,而任务调度使用的是开源的xxl-job
改为分布式调度也很简单
- 首先获取当前节点和总节点数量
// 当前分片int shardIndex = XxlJobHelper.getShardIndex();// 分片总数int shardTotal = XxlJobHelper.getShardTotal();
- 获取业务任务取模处理
select * from test_job where mod(id, #{shardTotal}) = #{shardIndex}
- 修改任务路由策略为分片广播
问题
遇到的问题是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机器地址(注册节点)加倍问题相关推荐
- xxl子任务_阿里面试官:聊一下分布式任务调度有那些解决方案?
作者:黄兆平 来源:http://blog.freshfood.cn/article/39 # 简介 随着系统规模的发展,定时任务数量日益增多,任务也变得越来越复杂,尤其是在分布式环境下,存在多个业务 ...
- 【分布式任务调度】(二)XXL-JOB执行器配置及定时任务的创建
文章目录 1. 概述 2. 调度器配置 2.1.依赖及配置 2.2.任务实例 2.3.调度中心管理配置 3. 总结 1. 概述 在上一篇<XXL-JOB调度中心集群部署配置>中,我们已经得 ...
- xxl-job调度中心、执行器源码详解
文章目录 简介 调度中心 一.程序启动初始化 1.初始化入口类 2.初始化I18n 3.初始化快慢调度线程池 4.初始化处理执行器注册或移除线程池+更新执行器最新在线的守护线程 5.初始化监控任务调度 ...
- XXL-JOB原理--执行器注册(二)
1.xxl-job添加执行器到任务调度中心有两种方式 (1)客户端执行器自动将名称和机器地址注册到任务调度中心 (2)可以在任务调度中心手动录入执行器名称和相关的机器地址(多个机器地址用逗号隔开) 2 ...
- xxl-job(v2.1.0 Release)执行器端的执行器自动注册原理
(一)xxl-job介绍以及搭建过程 (二)xxl-job执行器端的执行器自动注册原理 (三)xxl-job调度器端的执行器自动注册原理 (四)xxl-job任务管理以及调度器端任务手动执行的原理 ( ...
- 【分布式任务调度】(三)XXL-JOB调度中心对执行器的上下线感知实现原理
文章目录 1. 前言 2. 调度关系 3. 执行器注册 3.1. 调度中心处理注册请求 3.2. 执行器发起注册请求 4. 执行器注销 4.1.主动注销 4.2. 被动注销 5.流程图 6. 总结 这 ...
- XXL-JOB - 调度中心和执行器的简单使用
XXL-JOB - 调度中心和执行器的简单使用 XXL-JOB是什么 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线 ...
- 安卓app源码和设计报告——简易记账本
课 程 设 计(实训)说 明 书 题目 实现简易记账本功能 专 业 班 级 学生姓名 同组学生 指导老师 课程设计(实训)评语 学生姓名 专业 班级 2 题目 实现简易记账本功能 评语: 成绩: 优 ...
- 晨曦记账本,管理收入支出
随着人们生活水平的提高,经济收入的提高,人们也越来越关注家庭收支,管理家庭收支也是大家很关注的问题,今天小编分享一款用电脑记录收支情况的好方法. 先在电脑上下载一个晨曦记账本,第一次使用的小伙伴先注册 ...
最新文章
- 资本|五大科技巨头并购投资布局分析
- SpringMVC:学习笔记(11)——依赖注入与@Autowired
- 碗都交出去了,能不能分到羹?
- xadsafe做暗刷_手把手教你如何去掉网吧广告之网维大师_XADSAFE
- Percona Server for MySQL 5.5.30-30.2
- iOS推送群发的问题,PushSharp作者的这篇讲得最详细了
- 【我的物联网成长记9】物联网平台安全如何破?
- 企业文化用品展示网页的开发
- 函数的返回竟然能作为左值
- day_log 12月份的
- [News]传奇乞丐粉笔字震惊全国 字库上门求字
- centos进入管理员_centOS 如何让当前用户取得管理员权限
- 市场调研-全球与中国LED多层指示灯市场现状及未来发展趋势
- 计算机科学的主要研究领域是,斯坦福大学计算机科学专业研究领域有哪些?
- 英语语法之强调句和倒装
- 外贸人如何把握客户跟进频率?
- 功利主义穆勒思维导图_边沁与穆勒的功利主义思想之比较
- Linux主机和Windows主机有什么区别?
- [珍藏] 技能图谱握在手,召唤神龙不用愁
- 恶意代码分析实战Lab0701