小军和我说 AbstractDistributeOnceElasticJobListener 的 doAfterJobExecutedAtLastCompleted 方法 在使用中有些问题。
elastic job 其实是 分布式定时任务调度框架 ,git 地址: https://github.com/elasticjob
公司使用的是 elastic-job-lite 的2.1.5 版 ,
git 地址: https://github.com/elasticjob/elastic-job-lite/releases/tag/2.1.5
以下问题以及源码分析 基于2.1.5 版
发现问题如下 :
问题1 官方文档中 AbstractDistributeOnceElasticJobListener 在分布式作业中只执行一次的监听器, Listener 中 doAfterJobExecutedAtLastCompleted 在job 完成后 会只执行一次 , 实际上 5,15s 调度时间 中 测试中 , 3个实例 ,执行了 两次 甚至三次 。 也就是说 doAfterJobExecutedAtLastCompleted 业务逻辑 最好 能保持幂等 ,如果不 幂等 , 会有多次 执行的问题 。后面的源码解析Elastic job - doAsfterJobExecutedAtLastComplete... 会给出答案 ,问题如下
实例1
实例2
doAfterJobExecutedAtLastCompleted 在实例1 ,实例2 简单输出了 ---end--- 执行了 两次
问题2 当某一实例任务的 执行时间 大于AbstractDistributeOnceElasticJobListener 的 completedTimeoutMilliseconds ,其余完成实例会报超时异常 ,
比如 3实例 有2实例 完成了 , 第三实例 超时了 ,这时候 完成两实例 会报超时异常 如下
当次 任务 的 doAfterJobExecutedAtLastCompleted 方法是否 会执行呢 。测试中 没有执行 ,但是 也有可能 会执行 。 后面的源码 解析Elastic job - doAsfterJobExecutedAtLastComplete... 会给出答案
问题3 当某一实例 挂掉时候 ,集群的leader 会报异常(这个是使用了内嵌zk 原因) ,当job完成的时候 , 只会重新分片
如果 job没有完成 类似于 问题2 , leader 报异常后 会报超时异常 ,后面源码解析会给出答案
问题 4 任务出现了补偿 机制 , 简单说 2 s调度 执行一次任务 。 任务 执行一次需3s , 那么 ,会在当前调度过程中 ,执行 补偿的下次任务调度 。 如下 ,一次调度中 执行了两次 ,具体实现 可以看源码解析
问题 5 多次注册listener 爆出 异常 这个应该使用问题 。
网友评论