Elastic Job 入门教程(六)— “动态”新增脚本类型作业(Script Job)
在Elastic Job 入门教程(二)— Spring Boot框架下是实现Elastic Job 脚本作业(Script Job)中,我们简单介绍了如何在SpringBoot框架下以注解的方式实现脚本类型作业(Script Job),这里我们要提出一个问题?
如何在不修改源码的情况下,仅通过增加配置就可以达到新增一个脚本类型的作业?
这是有意义的,因为在实际的业务场景中,我们不可能只有一个脚本作业,很多情况甚至绝大部分情况都会超过一个脚本作业,可能一个脚本作业负责业务跑批,另一个脚本负责业务备份,还有别的其他脚本负责别的一些逻辑。那么按照Elastic Job 入门教程(二)— Spring Boot框架下是实现Elastic Job 脚本作业(Script Job)【注:本章只是简单介绍SpringBoot框架下脚本类作业的实现方式】中文章中的实现方式,可能我们每次新增一个脚本作业,都要对应增加配置选项,同时新增定义一个属性Bean对象ElasticScriptJobProperties来获取脚本作业属性,同时再新增对应一个ElasticScriptJob来定义作业,这不是一种理想的实现方式。
下面我们介绍SpringBoot框架下如何“动态”的增加Elastic Job的脚本型作业。
首先,定义一个简单的CommonScriptJob组件,用以获取脚本类型作业的相关配置
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Component
@ToString(doNotUseGetters = true)
public class CommonScriptJob {
private String cron;
private int shardingTotalCount;
private String shardingItemParameters;
private String jobDescription;
private String jobParameter;
private String jobName;
private String scriptCommandLine;
}
定义脚本作业集合,这里我们使用@PropertySource加载外部配置文件jobs.yml
/**
* @author clyde lou
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Configuration
@ConfigurationProperties("script-job-list")
@PropertySource(name = "批量作业集合", value = "file:${config.path}/jobs.yml", factory = YamlPropertySourceFactory.class)
@Slf4j
public class ScriptJobsConfig {
private List<CommonScriptJob> jobs;
@Autowired
private ZookeeperRegistryCenter regCenter;
@Autowired
private CommonElasticJobListener commonElasticJobListener;
@Autowired
private JobEventConfiguration jobEventConfiguration;
@PostConstruct
public void registerJob() {
log.info("jobs is {}", jobs);
jobs.stream().forEach(job -> (new JobScheduler(regCenter
, scriptLiteJobConfiguration(job)
, jobEventConfiguration, commonElasticJobListener)
).init());
}
private LiteJobConfiguration scriptLiteJobConfiguration(CommonScriptJob commonScriptJob) {
JobCoreConfiguration.Builder builder = JobCoreConfiguration.newBuilder(commonScriptJob.getJobName()
, commonScriptJob.getCron()
, commonScriptJob.getShardingTotalCount());
JobCoreConfiguration jobCoreConfiguration = builder
.shardingItemParameters(commonScriptJob.getShardingItemParameters())
.description(commonScriptJob.getJobDescription())
.jobParameter(commonScriptJob.getJobParameter())
.build();
ScriptJobConfiguration scriptJobConfiguration = new ScriptJobConfiguration(jobCoreConfiguration
, commonScriptJob.getScriptCommandLine());
return LiteJobConfiguration
.newBuilder(scriptJobConfiguration)
.overwrite(true)
.build();
}
}
注意:这里,我们使用了@PostConstruct注解,当我们获取到所有的脚本作业配置之后,就可以逐一构建JobScheduler对象
jobs.yml中script-job-list的节点定义为List
script-job-list:
jobs[0]:
cron: 0/5 * * * * ?
shardingTotalCount: 2
shardingItemParameters: 0=BJ,1=SH
jobDescription: "elastic script job2"
jobParameter: "elastic script job2"
jobName: "elastic script job2"
scriptCommandLine: "d:/run.bat"
jobs[1]:
cron: 0/10 * * * * ?
shardingTotalCount: 2
shardingItemParameters: 0=BJ,1=SH
jobDescription: "elastic script job3"
jobParameter: "elastic script job3"
jobName: "elastic script job4"
scriptCommandLine: "d:/run.bat"
这样,如果后续我们需要新增脚本作业,仅需要对jobs.yml中的script-job-list新增Job节点即可
代码运行结果
更多源码请参考:
https://github.com/ypmc/spring-cloud/tree/master/spring-elastic-job