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重复推送原因暂未找到