springboot实现多实例crontab抢占定时任务(实例代码)
github:https://github.com/jiasion/eslog
wechat:minghui-666
利用redisson实现多实例抢占定时任务
pom.xml
org.redisson redisson 3.12.0
Kernel.java-重写多线程调度
packagecom.brand.log.scheduler; importorg.springframework.context.annotation.Configuration; importorg.springframework.scheduling.annotation.SchedulingConfigurer; importorg.springframework.scheduling.config.ScheduledTaskRegistrar; importjava.util.concurrent.Executors; @Configuration publicclassKernelimplementsSchedulingConfigurer{ @Override publicvoidconfigureTasks(ScheduledTaskRegistrartaskRegistrar){ //设定一个长度10的定时任务线程池 taskRegistrar.setScheduler(Executors.newScheduledThreadPool(4)); } }
RedissonManager.java - 分布式锁的实现
packagecom.brand.log.util; importlombok.extern.slf4j.Slf4j; importorg.redisson.Redisson; importorg.redisson.config.Config; importorg.springframework.beans.factory.annotation.Value; importorg.springframework.stereotype.Component; importjavax.annotation.PostConstruct; @Component @Slf4j publicclassRedissonManager{ @Value("${spring.redis.host}") privateStringhost; @Value("${spring.redis.port}") privateintport; privateRedissonredisson=null; privateConfigconfig=newConfig(); @PostConstruct privatevoidinit(){ try{ config.useSingleServer().setAddress("redis://"+host+":"+port); log.info("redissonaddress{}{}",host,port); redisson=(Redisson)Redisson.create(config); log.info("Redisson初始化完成"); } catch(Exceptione){ log.error("initRedissonerror",e); } } publicRedissongetRedisson(){ returnredisson; } }
CronSynData.java
packagecom.brand.log.scheduler; importcom.brand.log.util.DateFormatV1; importcom.brand.log.util.RedisUtil; importcom.brand.log.util.RedissonManager; importlombok.extern.slf4j.Slf4j; importorg.redisson.Redisson; importorg.redisson.api.RLock; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.scheduling.annotation.Scheduled; importorg.springframework.stereotype.Component; importjava.util.concurrent.TimeUnit; @Component @Slf4j publicclassCronSynData{ @Autowired RedissonManagerredissonManager; @Autowired RedisUtilredisUtil; @Autowired DateFormatV1dateFormatV1; privateStringlokFlag=".handleKernel"; privateRedissonredisson=null; /* *java定时脚本挂靠实例 *多实例会有重复调用问题+使用Redisson实现分布式锁 *业务逻辑必须加锁+且需要保证tryLock等待时间小于cron的最小间隔执行时间 **/ @Scheduled(cron="*/10*****") publicvoidhandleKernel(){ redisson=redissonManager.getRedisson(); if(redisson!=null){ RLocklock=redisson.getLock(this.getClass().getName()+lokFlag); Booleanstat=false; try{ //尝试加锁,立即返回,最多等待5s自动解锁 stat=lock.tryLock(0,5,TimeUnit.SECONDS); if(stat){ log.info("{}取锁成功!{}",this.getClass().getName(),Thread.currentThread().getName()); redisUtil.checkCount("log:limit_",dateFormatV1.getDate("HH","GMT+8"),60*10,1000); }else{ log.info("{}没有获取到锁:{}",this.getClass().getName(),Thread.currentThread().getName()); } }catch(InterruptedExceptione){ log.error("Redisson获取分布式锁异常",e); if(!stat){ return; } lock.unlock(); } } } }
kibana-6个实例
总结
以上所述是小编给大家介绍的springboot实现多实例crontab抢占定时任务,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。