由于公司需求,去学习xxl-job 这个分布式调度的管理系统,如何公司又表明需要一套oralce版本的xxl-job ,于是开始改,在网上自己找相应的代码,可把我玩坏了,这里面很重要的俩个点,一个是代码,一个是数据库,这里俩样一定要是一致的或者处于同一个博主,有部分情况是网上有代码,没数据库,有数据库没代码,反正牛头不对马嘴的,以为问题不大,跑起来让你摸不着头脑,我在这个坑里 摸爬滚打 了2天才自己慢慢完善出来的,当然本文并不是讲解如何改Oralce版本,是改好后的一些细节处理(有想改的或者碰到问题,或想要源码的 可以私我)。
言归正传
分清俩个表
- xxl_job_group 执行器信息表
- xxl_job_registry 执行器注册表
管理后台的执行器数据是显示执行器注册表的,每个执行器启动都会注册到xxl-job-admin模块中去,执行器注册信息是动态的,当你单体执行器挂了,执行器注册表(registry) 数据会删除,但是执行器信息表(group)数据不会删除。
online地址问什么会时而有,时而无呢,我跟了一波代码,找到了JobGroupController类的这个方法,查询所有的执行器信息,这只是一个简单的查询,那信息的地址跳动的话说明信息会定时更新。
代码
于是我进到dao层找到了唯一的修改方法
- 找到调用过到这个方法的地方,于是找到了JobRegistryMonitorHelper类 这个类是执行器注册表的类(registry) ,里面是线程调用实现的信息动态处理,我大致分为4步。
第一步 (查询出来注册地址类型是0的,注册信息List)
第二步 (通过id集合,删除(Registry)查询出来的执行器注册信息)
第三步 (查询 当前时间 到 90s前 有修改过的 执行器注册信息)
第四步 (把 step1处 查询来的注册信息 进行修改)
仔细看的话,这里没有新数据来源的方法,相当于这四步都是在处理同一批数据。
那为什么online数据会跳动呢。
可以看到这四步 主要的第二步是删除查询出来的全部执行器信息,然后是查询90s内有修改过的执行器信息重点来了,数据都删了查询啥玩意,后面还修改的,我于是打断点发现删除后的确数据空了,在断点没放出来的情况 10s 左右,数据又都回来了
锁定俩个类
- AdminBizImpl
- JobRegistryMonitorHelper
直接copy 在idea里搜索就行了
AdminBizImpl类的 registry(RegistryParam registryParam)方法
从图片中能看出来开发团队其实想从java里传参数new Date() 给sql 去新增的,总而言之上面删除的执行器注册信息,是这里新增进来的,所以主要修改这里,在mysql中的确没问题,但是在oracle数据库中,会默认抹去时分秒(有人会觉得抹掉一点,问题不大,上面有说到90s内被修改过的执行器注册信息),就是没有时分秒所有一直查询不到这个执行器的地址,我们只需要不用它穿的new Date()参数即可,用oracle自带的sysdate 就会带上时分秒,就能被上面查询到了。
解决方法
修改XxlJobRegistryMapper.xml 里的这俩个方法里面的update 的值,不用穿的参数,用sysdate。
//修改方法的sql
<update id="registryUpdate" >
UPDATE xxl_job_registry
SET update_time = sysdate
WHERE registry_group = #{registryGroup,jdbcType=VARCHAR}
AND registry_key = #{registryKey,jdbcType=VARCHAR}
AND registry_value = #{registryValue,jdbcType=VARCHAR}
</update>
//新增方法的sql
<insert id="registrySave" >
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select <include refid="XXL_JOB_REGISTRY_ID" /> from dual
</selectKey>
INSERT INTO xxl_job_registry( id,registry_group , registry_key , registry_value, update_time)
VALUES( #{id},#{registryGroup,jdbcType=VARCHAR} , #{registryKey,jdbcType=VARCHAR} , #{registryValue,jdbcType=VARCHAR}, sysdate)
</insert>