千家信息网

springboot怎么解决多个deploy执行schedule定时器导致并发问题

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这篇文章主要讲解了"springboot怎么解决多个deploy执行schedule定时器导致并发问题",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"s
千家信息网最后更新 2025年02月04日springboot怎么解决多个deploy执行schedule定时器导致并发问题

这篇文章主要讲解了"springboot怎么解决多个deploy执行schedule定时器导致并发问题",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"springboot怎么解决多个deploy执行schedule定时器导致并发问题"吧!

springboot部署多个相同服务deploy,当服务中有定时器时,一旦定时器触发时服务会同时执行,从而产生并发问题。解决方案:

1.在定时器类添加@Profile 注解 指定实例执行定时器。

@Component@Configuration@EnableScheduling   // 1.开启定时任务@Profile("deploy01")public class ScheduleTaskService {....}

它操作简单,灵活。只需要添加@Profile注解,但它的局限性也很明显,只有指定服务为deploy01时才会加载定时器处理类,一旦deploy01 挂掉或者未启动就无法执行。所以并不能达到高可用。

2.利用redis 缓存机制

   @Scheduled(cron = "0 0 0/1 * * ? ")  //每1小时执行一次    public void insertPriRecoverCall() throws InterruptedException {        String deployKey="deployName";        redisService.set(deployKey,deployId,1,TimeUnit.HOURS);        Object o = redisService.get(deployKey);        if (o!=null){            String deployName = o.toString();            if (deployId.equals(deployName)){                logger.info(deployName+" is running .....");                ////业务代码            }        }    }

先获取服务实例Id,缓存到redis中。redis 是key-value 键值对的缓存机制。在相同key下只会保留一个deployId ,再取出缓存中deployId和服务实例id 比较。相同就继续执行业务代码,不同则直接过滤。这样既可以防止并发问题,又可以实现高可用。

感谢各位的阅读,以上就是"springboot怎么解决多个deploy执行schedule定时器导致并发问题"的内容了,经过本文的学习后,相信大家对springboot怎么解决多个deploy执行schedule定时器导致并发问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0