java定时器多个组件同时_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 比较。相同就继续执行业务代码,不同则直接过滤。这样既可以防止并发问题,又可以实现高可用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值