使用Elastic-Job创建动态定时任务

2022-06-21 13:47:19

1、Elastic Job简介

elastic-job是当当开源的一款非常好用的作业框架,在这之前,我们开发定时任务一般都是使用quartz或者spring-task(ScheduledExecutorService),无论是使用quartz还是spring-task,我们都会至少遇到两个痛点:

不敢轻易跟着应用服务多节点部署,可能会重复多次执行而引发系统逻辑的错误。
quartz的集群仅仅只是用来HA,节点数量的增加并不能给我们的每次执行效率带来提升,即不能实现水平扩展。
Elastic job是当当网架构师张亮,曹昊和江树建基于Zookepper、Quartz开发并开源的一个Java分布式定时任务,解决了Quartz不支持分布式的弊端。Elastic job主要的功能有支持弹性扩容,通过Zookepper集中管理和监控job,支持失效转移等。项目由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。

2、使用Elastic Job实现静态定时任务

2.1 pom.xml引入依赖包

<dependency><groupId>com.github.kuhn-he</groupId><artifactId>elastic-job-lite-spring-boot-starter</artifactId><version>2.1.5</version></dependency>

2.2 application.properties配置文件中添加配置zookeeper服务地址信息以及注册的命名空间名字

server.port=8080
spring.application.name=elastic-job-02

elaticjob.zookeeper.server-lists=192.168.1.12:2181
elaticjob.zookeeper.namespace=job1

2.3 静态定时符务实现类StaticJobTask.java

@ElasticSimpleJob(
        jobName="${elaticjob.zookeeper.namespace}",  // 指定Zookeeper中的命名空间
        shardingTotalCount= 1, //分版cron="0/10 * * * * ? *"   //cron表达式)
@Component
public class StaticJobTask implements SimpleJob{

    @Override
    public void execute(ShardingContext shardingContext){
        System.out.println("---------静态定时任务测试----------------");}}

在这里插入图片描述

3、使用Elastic Job实现静态定时任务

3.1 application.properties配置信息

elaticjob.zookeeper.dynamiczk=192.168.1.12:2181
elaticjob.zookeeper.namespace2=job2

3.2 向zk进行注册,DynamicConfig.java


@Configuration
public class DynamicConfig{

    @Value("${elaticjob.zookeeper.dynamiczk}")
    private String dynamiczk;
    @Value("${elaticjob.zookeeper.namespace2}")
    private String dynamicnamespace;

    @Bean
    public ZookeeperConfiguration zookeeperConfiguration(){return new ZookeeperConfiguration(dynamiczk,dynamicnamespace);}

    @Bean(initMethod="init")
    public ZookeeperRegistryCenter zookeeperRegistryCenter(ZookeeperConfiguration zookeeperConfiguration){return new ZookeeperRegistryCenter(zookeeperConfiguration);}}

3.3 动态创建定时任务工具类

@Component
public class DynamicTaskAdd{

    @Autowired
    private ZookeeperRegistryCenter zookeeperRegistryCenter;

    /***
     * 动态创建定时任务
     * @param jobName:定时任务名称
     * @param cron:表达式
     * @param shardingTotalCount:分片数量
     * @param instance:定时任务实例
     * @param parameters:参数
     */
    public void create(String jobName, String cron, int shardingTotalCount, SimpleJob instance,String parameters){

        LiteJobConfiguration.Builder builder= LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(
                JobCoreConfiguration.newBuilder(
                        jobName,
                        cron,
                        shardingTotalCount).jobParameter(parameters).build(),
                instance.getClass().getName())).overwrite(true);
        LiteJobConfiguration liteJobConfiguration= builder.build();

        new SpringJobScheduler(instance,zookeeperRegistryCenter,liteJobConfiguration).init();}}

3.4 定时任务类,DynamicJob.java

public class DynamicJob implements SimpleJob{

    @Override
    public void execute(ShardingContext shardingContext){
        // 参数  
        String JobParameter= shardingContext.getJobParameter();
        System.out.println("---------DynamicJob-------------:" + JobParameter);}}

3.5 在controller中动态创建动态定时任务,TestJobController.java

@RestController
public class TestJobController{

    @Autowired
    private DynamicTaskAdd dynamicTaskAdd;

    @GetMapping("/jobtest")
    public void test(){
        // cron表达式  
        Stringcron="47 59 08 09 04 ? 2021";
        dynamicTaskAdd.create("job001", cron, 1, new DynamicJob(),"test");}}

浏览器中访问 http://localhost:8080/jobtest 到指定时间,控制台会输出
在这里插入图片描述

  • 作者:蔚蓝色天空sky
  • 原文链接:https://blog.csdn.net/ytangdigl/article/details/115536913
    更新时间:2022-06-21 13:47:19