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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。