最近在给服务器搭建集群nginx的时候遇到了一个问题,mysql主从也搭建好了。其中有一个定时任务的问题,由于是主从两台机器,程序需要用nginx做反向代理,两台服务器都需要部署相同的程序,这样的话,每台服务器都有可能执行定时任务,导致定时任务重复执行,出现错乱的脏数据。研究了好久终于找到 了解决方案。
这个问题对于新手来说确实是一个挑战。不废话直接入正题。
解决方案是利用redis 的分布式锁来加锁。具体的方案入下:
1. springboot的 yml文件需要配置redis 相关信息:
具体的yml中怎么配置redis百度即可,这里不多说!
2. 定时器中生命锁和key的名字
3. 业务逻辑部分:
public void 执行方法(){
boolean lock = false;
try {
//这里利用redis的分布式锁机制控制集群环境下定时器重复执行的问题
lock = redisTemplate.opsForValue().setIfAbsent(KEY, LOCK);
logger.info("是否获取到锁:" + lock);
if (lock) {
//这里就是你自己的业务信息。
} else {
logger.info("没有获取到锁,不执行任务!");
return;
}
} finally {
if (lock) {
redisTemplate.delete(KEY);
logger.info("任务结束,释放锁!");
} else {
logger.info("没有获取到锁,无需释放锁!");
}
}
}
}
写到这里基本就结束了。经过本人测试,目前没有发现问题。
本人录制了一下智慧消防物联网方面的课程,希望对大家有帮助,需要的可以点击。
立即点击学习 :智慧消防解决方案