由于公司需求,去学习xxl-job 这个分布式调度的管理系统,如何公司又表明需要一套oralce版本的xxl-job ,于是开始改,在网上自己找相应的代码,可把我玩坏了,这里面很重要的俩个点,一个是代码,一个是数据库,这里俩样一定要是一致的或者处于同一个博主,有部分情况是网上有代码,没数据库,有数据库没代码,反正牛头不对马嘴的,以为问题不大,跑起来让你摸不着头脑,我在这个坑里 摸爬滚打 了2天才自己慢慢完善出来的,当然本文并不是讲解如何改Oralce版本,是改好后的一些细节处理(有想改的或者碰到问题,或想要源码的 可以私我)。
言归正传
分清俩个表
- xxl_job_group 执行器信息表
- xxl_job_registry 执行器注册表
管理后台的执行器数据是显示执行器注册表的,每个执行器启动都会注册到xxl-job-admin模块中去,执行器注册信息是动态的,当你单体执行器挂了,执行器注册表(registry) 数据会删除,但是执行器信息表(group)数据不会删除。
online地址问什么会时而有,时而无呢,我跟了一波代码,找到了JobGroupController类的这个方法,查询所有的执行器信息,这只是一个简单的查询,那信息的地址跳动的话说明信息会定时更新。
代码

于是我进到dao层找到了唯一的修改方法

- 找到调用过到这个方法的地方,于是找到了JobRegistryMonitorHelper类 这个类是执行器注册表的类(registry) ,里面是线程调用实现的信息动态处理,我大致分为4步。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PpPTzJhn-1611830622730)(https://uploader.shimo.im/f/MDxolE4wJ8yUaPxk.png!thumbnail?fileGuid=6YH3cKV9yW8vWDp6)]](https://i-blog.csdnimg.cn/blog_migrate/028b314b5f0bce47333155725a6b6eb0.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ZW3aFhe-1611830622732)(https://uploader.shimo.im/f/WHTYALCXKm1BUDaH.png!thumbnail?fileGuid=6YH3cKV9yW8vWDp6)]](https://i-blog.csdnimg.cn/blog_migrate/053de955407191965dea7a65b8eee7a9.png)
第一步 (查询出来注册地址类型是0的,注册信息List)
第二步 (通过id集合,删除(Registry)查询出来的执行器注册信息)
第三步 (查询 当前时间 到 90s前 有修改过的 执行器注册信息)
第四步 (把 step1处 查询来的注册信息 进行修改)
仔细看的话,这里没有新数据来源的方法,相当于这四步都是在处理同一批数据。
那为什么online数据会跳动呢。
可以看到这四步 主要的第二步是删除查询出来的全部执行器信息,然后是查询90s内有修改过的执行器信息重点来了,数据都删了查询啥玩意,后面还修改的,我于是打断点发现删除后的确数据空了,在断点没放出来的情况 10s 左右,数据又都回来了
锁定俩个类
- AdminBizImpl
- JobRegistryMonitorHelper
直接copy 在idea里搜索就行了
AdminBizImpl类的 registry(RegistryParam registryParam)方法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SklfREvW-1611830622734)(https://uploader.shimo.im/f/8aZfwq8MIZm6cyLk.png!thumbnail?fileGuid=6YH3cKV9yW8vWDp6)]](https://i-blog.csdnimg.cn/blog_migrate/85b623969a140d6d3c7dd819e11f191c.png)
从图片中能看出来开发团队其实想从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>
博客讲述了在将xxl-job分布式调度系统改为Oracle数据库版本时遇到的执行器注册信息动态更新问题。作者分析了代码流程,发现删除与新增执行器注册信息的逻辑导致在线地址不稳定。问题在于Oracle数据库在插入时间时不包含时分秒,导致无法查询到执行器地址。解决方案是修改XxlJobRegistryMapper.xml中的SQL语句,使用Oracle的sysdate代替Java的newDate(),确保时间信息完整,从而解决在线地址时有时无的问题。
294

被折叠的 条评论
为什么被折叠?



