记录springBoot定时任务@Scheduled遇到的问题

本文介绍了如何在Spring容器中正确使用定时类,避免因未添加Redis分布式锁导致的数据重复问题。作者还分享了解决多服务环境下定时任务重复执行的方法,推荐使用fixedRate和cron结合分布式锁来确保一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.新创建的定时类要把@Component注解加上,目的是将定时类加到spring容器管理,否则启动时会报找不到类的错误

2.如果正式环境是多服务环境,切记在定时中添加redis分布式锁,否则会出现业务数据重复的问题;本地可以通过改端口启动多个jar包进行测试

首先注入RedisTemplate,如果引入不进去要将对应maven加到pom中

调用opsForValue().setIfAbsent();使用了分布式锁和过期机制;我这里是把方法重新封装了一下,可以直接调用RedisTemplate对应的方法;

代码中实际处理,我这里设置的50秒自动过期

业务处理完成以后继续判断一下,防止没有删除成功(PS:我这里是封装的方法,在RedisTemplate中都有对应的方法调用)

3.还有一个问题是发布到正式环境定时,业务中有kafka推送代码,正式环境是4台服务,出现同一时间推送四次的问题,服务间启动有时间差,不是同时启动,当时我的定时是这样写的,每隔一分钟执行一次(此时我还没有加redis分布式锁)

当时排查考虑的是,项目不是同一时间启动,为什么定时会同一时间执行

后面是使用了fixedRate,和cron功能一样,但是解决了重复推送的问题,此时也是没有加redis分布式锁,项目启动有时间差

(一分钟执行一次)

总结:多服务使用定时任务要加redis分布式锁,业务场景满足的情况下尽量使用fixedRate相关,相当于双重控制;cron重复推送原因暂未找到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值