1、问题描述
最近项目上用到了 xxl-job 的分布式任务调度平台,但是使用时发现,在创建执行器时,根据官网文档进行操作,使用自动注册的方式,但是机器地址一直是空的,也就是执行器一直没有注册进来。
我们的这个项目用的是达梦数据库
2、原因分析
1)、首先看日志,启动日志说明执行器是正常创建了的
2)、网上出现很多这种问题,我也根据网上博客来操作,结果也是不行
-
首先是配置问题,配置的执行器名称要和创建的执行器名称一致
-
然后说是网络设置,要把其它的网络禁用,本机只有一个IP
3)、用示例的执行器来进行注册
我这个项目使用的是 2.3.1 版本的 xxl-job,我根据官网的步骤,新下载代码,进行执行器的注册,发现是正常的
-
我找了注册执行器的源码
-
发现执行注册器的保存是没问题的,但是每次保存后都马上又给删了;
-
然后我开始找判断注册器失效的代码,判断失效的逻辑是 90 秒如果没有更新时间,就认为这个注册器失效了;
-
问题就是这个方法:
···
<select id="findDead" parameterType="java.util.HashMap" resultType="java.lang.Integer" >
SELECT t.id
FROM xxl_job_registry AS t
WHERE t.update_time <![CDATA[ < ]]> (#{nowTime} - #{timeout} / 24/60/60 )
</select>
···
因为我们项目用的是达梦数据库,所以这里查询 小于 更新时间 90 秒的逻辑用的是达梦的语法,但是当时是直接从网上找的,没有详细测试,这里其实不对,可能是因为达梦8的原因,正确的修改方法如下:
···
SELECT t.id
FROM xxl_job_registry AS t
WHERE t.update_time <![CDATA[ < ]]> timestampadd(SECOND, -#{timeout}, sysdate )
···
终于好了!
3、反思
我觉得主要是要反思自己的排查流程,为什么这么慢才找到问题
1)、xxl-job 的 sql 日志没打开,导致排查的时候一直在看代码,debug 代码并没看到核心的SQL日志;
2)、没有及时看xxl-job 官网,这里的架构图上明确的标明了有注册服务,应该直接去找注册服务部分代码,看是如何注册的,才能快速定位问题!