Elastic Job 入门教程(六)— “动态”新增脚本类型作业(Script Job)

版权声明:自由转载,请附链接 https://blog.csdn.net/kangkanglou/article/details/82873194

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.ymlscript-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

猜你喜欢

转载自blog.csdn.net/kangkanglou/article/details/82873194