xxl-job Oracle版本 OnLine地址 不稳定

由于公司需求,去学习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)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ZW3aFhe-1611830622732)(https://uploader.shimo.im/f/WHTYALCXKm1BUDaH.png!thumbnail?fileGuid=6YH3cKV9yW8vWDp6)]

第一步 (查询出来注册地址类型是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)]

从图片中能看出来开发团队其实想从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>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值