【笔记】关于多服务部署时,定时任务如何只执行一次

做到一个项目,客户要求需要部署多套服务,避免发生故障时无法使用系统。
系统中包含定时任务来处理一些业务,是用注解@Scheduled 来实现的。
这样的话,在部署多个服务时就会出现每一个服务都跑一次定时任务的情况。

为了所有的服务运行时,只会跑一次定时任务。查找资料可以使用redis来实现锁,让所有的服务去争抢一个锁,谁抢到了谁就来跑定时任务。

在 Redis 中, SETNX 命令是可以帮助我们实现互斥。SETNX 即 SET if Not eXists (对应 Java 中的 setIfAbsent 方法),如果 key 不存在的话,才会设置 key 的值。如果 key 已经存在, SETNX 啥也不做。

 Java 中 setIfAbsent 方法,如果key不存在,则设置值,并且返回true。如果key存在,则返回false。

这个方法内部调用的是setnx的,用的redis依赖是2.6.3,查找资料redis是在2.6.12版本中,为set命令加入了新的参数,使该命令直接支持了分布式锁。

那么就可以通过这个方法来实现了。以下是实现的主要逻辑

这个实现是有缺陷的,有可能会出现方法还没有执行完,锁已经释放了的情况。而这个时候又有新一轮争抢锁的事件发生,就会出现问题。这个可以通过给锁续期来实现,这个后面再学习吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值