springboot中 quartz 的定时器如何保证在集群环境下不重复执行 SpringBoot利用redis分布式锁解决集群下定时任务重复执行

最近在给服务器搭建集群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("没有获取到锁,无需释放锁!");
            }
        }
    }
}

 

 

写到这里基本就结束了。经过本人测试,目前没有发现问题。

本人录制了一下智慧消防物联网方面的课程,希望对大家有帮助,需要的可以点击。

立即点击学习 :智慧消防解决方案 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanchufeng2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值