ElasticJobListener 2.1.5 分布式唯一性保证bug修复

在使用ElasticJob过程中遇到分布式监听执行重复的问题。分析源码发现,当多个节点几乎同时认为自己是最后一个注册节点时,会导致before方法被多次执行。为解决此问题,提出新的解决方案:仅当节点数为0时,判断所有节点注册成功并执行监听操作,同时引入锁定机制确保操作的原子性。修改后的源码已调整这一逻辑。
摘要由CSDN通过智能技术生成

最近执行esjob的时候,发现有一定的情况下,出现分布式监听执行了多次的情况,通过对比源码,我们发现一个问题

old version:

 @Override
    public final void beforeJobExecuted(final ShardingContexts shardingContexts) {
        guaranteeService.registerStart(shardingContexts.getShardingItemParameters().keySet());
        
            if (guaranteeService.isAllStarted()) {
                doBeforeJobExecutedAtLastStarted(shardingContexts);
                guaranteeService.clearAllStartedInfo();
                return;
            }
            try {
                Thread.sleep(500);
            }catch (Exception ex){
                ex.printStackTrace();
            }
      

        long before = timeService.getCurrentMillis();
        try {
            synchronized (startedWait) {
                startedWait.wait(startedTimeoutMilliseconds);
            }
        } catch (final InterruptedException ex) {
            Thread.interrupted();
        }
        if (timeService.getCurrentMillis() - before >= startedTimeoutMilliseconds) {
            guaranteeService.clearAllStartedInfo();
            handleTimeout(startedTimeoutMilliseconds);
        }
    }


逻辑是,现在zk注册节点,判断是否全部注册成功,全部成功,默认为最后一个注册的节点,执行befor方法,这个在单点机器上是没有问题的,但是在分布式环境就有问题,如果两个机器,很巧合的同时判断自己是最后一个节点(因为zk是多线程,不能保证时序进入)进入zk节点判断,都会做befor操作,为了解决这个问题,思路如下(只有0片节点判断是否结束,执行监听操作):

循环:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值