一套代码中的定时任务被多个机器运行,数据容易变多或变大的解决办法。
开发中遇到了这样的一个场景,同一套代码在多台机器运行。奇葩的是数据库表都是同一个。由于业务需要写了很多定时任务来批量处理数据。但是在运行过程中发现,当多台机器同时运行同一套代码对同一个数据源操作同一个表的时候会出现跑出来的数据比正式数据要打,或者要多,这个时候就想到了要用锁。
但是单纯的锁只能锁住仅在一台机器运行时并发请求线程的问题(定时任务不仅可以定时运行还可以手动触发运行)。并不能解决问题,这时就要用到分布式锁了。可以用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");
}
}
}
加入分布式锁后不论几台机器几个线程同时运行,最后只能运行最先抢到线程拿到锁的那个任务。



