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

由于公司需求,去学习xxl-job 这个分布式调度的管理系统,如何公司又表明需要一套oralce版本的xxl-job ,于是开始改,在网上自己找相应的代码,可把我玩坏了,这里面很重要的俩个点,一个是代码,一个是数据库,这里俩样一定要是一致的或者处于同一个博主,有部分情况是网上有代码,没数据库,有数据库没代码,反正牛头不对马嘴的,以为问题不大,跑起来让你摸不着头脑,我在这个坑里 摸爬滚打 了2天才自己慢慢完善出来的,当然本文并不是讲解如何改Oralce版本,是改好后的一些细节处理(有想改的或者碰到问题,或想要源码的 可以私我)。

言归正传

分清俩个表

  • xxl_job_group 执行器信息表
  • xxl_job_registry 执行器注册表

管理后台的执行器数据是显示执行器注册表的,每个执行器启动都会注册到xxl-job-admin模块中去,执行器注册信息是动态的,当你单体执行器挂了,执行器注册表(registry) 数据会删除,但是执行器信息表(group)数据不会删除。

online地址问什么会时而有,时而无呢,我跟了一波代码,找到了JobGroupController类的这个方法,查询所有的执行器信息,这只是一个简单的查询,那信息的地址跳动的话说明信息会定时更新。

代码

xxl-job Oracle版本 OnLine地址 不稳定_第1张图片

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

xxl-job Oracle版本 OnLine地址 不稳定_第2张图片

  • 找到调用过到这个方法的地方,于是找到了JobRegistryMonitorHelper类 这个类是执行器注册表的类(registry) ,里面是线程调用实现的信息动态处理,我大致分为4步。

xxl-job Oracle版本 OnLine地址 不稳定_第3张图片

xxl-job Oracle版本 OnLine地址 不稳定_第4张图片

第一步 (查询出来注册地址类型是0的,注册信息List)
第二步 (通过id集合,删除(Registry)查询出来的执行器注册信息)
第三步 (查询 当前时间 到 90s前 有修改过的 执行器注册信息)
第四步 (把 step1处 查询来的注册信息 进行修改)

仔细看的话,这里没有新数据来源的方法,相当于这四步都是在处理同一批数据。

那为什么online数据会跳动呢。

可以看到这四步 主要的第二步是删除查询出来的全部执行器信息,然后是查询90s内有修改过的执行器信息重点来了,数据都删了查询啥玩意,后面还修改的,我于是打断点发现删除后的确数据空了,在断点没放出来的情况 10s 左右,数据又都回来了

锁定俩个类

  • AdminBizImpl
  • JobRegistryMonitorHelper

直接copy 在idea里搜索就行了

AdminBizImpl类的 registry(RegistryParam registryParam)方法

xxl-job Oracle版本 OnLine地址 不稳定_第5张图片

从图片中能看出来开发团队其实想从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>

你可能感兴趣的:(IT,java,oracle)