栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

一套代码中的定时任务被多个机器运行,数据容易变多或变大的解决办法。

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一套代码中的定时任务被多个机器运行,数据容易变多或变大的解决办法。

一套代码中的定时任务被多个机器运行,数据容易变多或变大的解决办法。
开发中遇到了这样的一个场景,同一套代码在多台机器运行。奇葩的是数据库表都是同一个。由于业务需要写了很多定时任务来批量处理数据。但是在运行过程中发现,当多台机器同时运行同一套代码对同一个数据源操作同一个表的时候会出现跑出来的数据比正式数据要打,或者要多,这个时候就想到了要用锁。
但是单纯的锁只能锁住仅在一台机器运行时并发请求线程的问题(定时任务不仅可以定时运行还可以手动触发运行)。并不能解决问题,这时就要用到分布式锁了。可以用redis的分布式锁。
步骤,代码如下,不多解释


   org.redisson
   redisson
   3.16.3
   -- 版本按自己需求

步骤一:注入(前提是有没有redis依赖)

步骤二:代码中运用

@Scheduled(cron = "0 59 23 * * ?")
    public void stockAllCityJob(){
        String lockey = "stockAllCityJob_stockExchange_lock";
        RLock lock = redissonClient.getLock(lockey);
        try {
            if(!lock.tryLock(0,-1, TimeUnit.MINUTES)){
                log.warn("获取任务锁失败,退出。");
                return;
            }
            log.info("==================================定时任务开始=========================================================");
            //业务代码放在这里
            log.info("==================================定时任务结束=========================================================");

        } catch (InterruptedException e) {
            log.warn("获取任务锁异常,退出。");
            return;
        }finally {
            if(lock.isLocked() && lock.isHeldByCurrentThread()){
                lock.unlock();
                log.info(Thread.currentThread().getName() + "unlock");
            }
        }

    }

加入分布式锁后不论几台机器几个线程同时运行,最后只能运行最先抢到线程拿到锁的那个任务。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1028237.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号