记一次elastic-job使用
2024-08-27 14:18:07
当当的elastic-job定时任务
业务场景是定时从微信取accesstoken和jsticket,因为都只有7200秒的有效时间,所以设置了定时任务,定时将得到的数据存到redis缓存中
问题1:但是刚开始的时候将业务写在实现了simplejob类的类中,需要注入RedisCacheManager,结果发现是不能拿到的
所以更改了配置文件jobRegisterSupport
问题2:而且这个工作类的cron不管本地怎么改都不能改动,因为数据是从注册中心拿到的,所以在jobconfiguration中配置了overwrite为true,这样可以覆盖掉注册中心的配置
Elastic-Job-Lite采用无中心化设计,若每个客户端的配置不一致,不做控制的话,最后一个启动的客户端配置将会成为注册中心的最终配置。
Elastic-Job-Lite提出了overwrite概念,可通过JobConfiguration或Spring命名空间配置。overwrite=true即允许客户端配置覆盖注册中心,反之则不允许。如果注册中心无相关作业的配置,则无论overwrite是否配置,客户端配置都将写入注册中心。
原先的:
@Bean
public JobRegisterSupport jobRegisterSupport(CoordinatorRegistryCenter coordinatorRegistryCenter, ApplicationContextOwner applicationContextOwner){
ElasticJobClassScanner scanner = new ElasticJobClassScanner();
scanner.addIncludeFilter(new AssignableTypeFilter(ElasticJob.class) {
@Override
protected boolean matchClassName(String className) {
return false;
}
});
scanner.addExcludeFilter(new AnnotationTypeFilter(JobExclude.class) {
@Override
protected boolean matchClassName(String className) {
return false;
}
});
Set<Class> classes = scanner.doScan("*.*.jobInstance");//自己的工作类
classes.forEach(clazz ->Arrays.stream(JobConfig.JobElement.values()).forEach(jobElement -> {
if (clazz == jobElement.getJobClass()){
JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder(jobElement.getJobName(), jobElement.getCron(), jobElement.getShardingTotalCount()).build();
SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration, clazz.getCanonicalName());
LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfiguration).build();
JobScheduler jobScheduler = new JobScheduler(coordinatorRegistryCenter, simpleJobRootConfig);
jobScheduler.init();
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)applicationContextOwner.getApplicationContext().getAutowireCapableBeanFactory();
beanFactory.registerSingleton(clazz.getCanonicalName(),jobScheduler);
return;
}
}));
return new JobRegisterSupport();
}
改过的:
@Bean
public JobRegisterSupport jobRegisterSupport(CoordinatorRegistryCenter coordinatorRegistryCenter, ApplicationContextOwner applicationContextOwner){
ElasticJobClassScanner scanner = new ElasticJobClassScanner();
scanner.addIncludeFilter(new AssignableTypeFilter(ElasticJob.class) {
@Override
protected boolean matchClassName(String className) {
return false;
}
});
scanner.addExcludeFilter(new AnnotationTypeFilter(JobExclude.class) {
@Override
protected boolean matchClassName(String className) {
return false;
}
});
Set<Class> classes = scanner.doScan("*.*.job.jobInstance");
classes.forEach(clazz ->Arrays.stream(JobConfig.JobElement.values()).forEach(jobElement -> {
if (clazz == jobElement.getJobClass()){
JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder(jobElement.getJobName(), jobElement.getCron(), jobElement.getShardingTotalCount()).build();
SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration, clazz.getCanonicalName());
LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(simpleJobConfiguration).overwrite(true).build();//加入了覆盖
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)applicationContextOwner.getApplicationContext().getAutowireCapableBeanFactory();
AbstractBeanDefinition ActualRawBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(clazz).setScope(BeanDefinition.SCOPE_SINGLETON).getRawBeanDefinition();
beanFactory.registerBeanDefinition(clazz.getCanonicalName(),ActualRawBeanDefinition);
SpringJobScheduler springJobScheduler = new SpringJobScheduler((SimpleJob)beanFactory.getBean(clazz), coordinatorRegistryCenter, liteJobConfiguration);
springJobScheduler.init();
beanFactory.registerSingleton("spring" + clazz.getCanonicalName(),springJobScheduler);
return;
}
}));
return new JobRegisterSupport();
}
最新文章
- 元素堆叠问题、z-index、position
- UI基础
- Mvc学习--1
- html 用图片代替重置按钮
- 【VBA研究】变量定义的类型和实际赋值类型
- Deep Learning(深度学习)学习笔记整理系列之(二)
- 编程语言性能游戏排行榜,C/C++第一ATS第二JAVA第三
- Dell7040mt安装win7系统说明
- read file in a single line
- 自动化测试:behave
- 解决xshell评估期已过的问题
- Spring 中@NotNull, @NotEmpty和@NotBlank之间的区别是什么?
- Django REST framework+Vue 打造生鲜超市(三)
- [IOT] 自制蓝牙工牌办公室定位系统 (一)—— 阿里物联网平台概览及打通端到云(硬核&#183;干货)
- 笔记:Python 默认参数必须指向不变对象
- HanLP的自定义词典使用方式与注意事项介绍
- delphi JPG或BMP图片透明显示
- 尼基塔第一季/全集Nikita迅雷下载
- Spring Boot 不使用默认的 parent,改用自己的项目的 parent
- 企业生产环境集群稳定性-HA就行吗?