1. 介绍

当前主流的分布式任务调度:

feature quartz elastic-job xxl-job antares opencron
依赖 mysql jdk1.7+, zookeeper 3.4.6+ ,maven3.0.4+ mysql ,jdk1.7+ , maven3.0+ jdk 1.7+ , redis , zookeeper jdk1.7+ , Tomcat8.0+
HA 多节点部署,通过竞争数据库锁来保证只有一个节点执行任务 通过zookeeper的注册与发现,可以动态的添加服务器。 支持水平扩容 集群部署 集群部署
任务分片 支持 支持 支持
文档完善 完善 完善 完善 文档略少 文档略少
管理界面 支持 支持 支持 支持
难易程度 简单 简单 简单 一般 一般
公司 OpenSymphony 当当网 个人 个人 个人
高级功能 弹性扩容,多种作业模式,失效转移,运行状态收集,多线程处理数据,幂等性,容错处理,spring命名空间支持 弹性扩容,分片广播,故障转移,Rolling实时日志,GLUE(支持在线编辑代码,免发布),任务进度监控,任务依赖,数据加密,邮件报警,运行报表,国际化 任务分片, 失效转移,弹性扩容 , 时间规则支持quartz和crontab ,kill任务, 现场执行,查询任务运行状态
使用企业 大众化产品,对分布式调度要求不高的公司大面积使用 36氪,当当网,国美,金柚网,联想,唯品会,亚信,平安,猪八戒 大众点评,运满满,优信二手车,拍拍贷

ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。 它通过弹性调度、资源管控、以及作业治理的功能,打造一个适用于互联网场景的分布式调度解决方案,并通过开放的架构设计,提供多元化的作业生态。 它的各个产品使用统一的作业 API,开发者仅需一次开发,即可随意部署。

ElasticJob 已于 2020 年 5 月 28 日成为 Apache ShardingSphere 的子项目。

image-20211213130023693

注意:使用elastic job 需要提前安装好ZK环境。

以下案例都基于Spring boot工程编写。

2. 静态任务

静态定时任务也就是指将定时执行的周期固定,每次都会按照指定时间执行,elasticjob实现该操作比较简单。我们来实现一次该操作。

操作步骤:

  • 1.执行周期

  • 2.分片

  • 3.指定ZK中的命名空间

  • 引入依赖

    <!-- ElasticJobAutoConfiguration自动配置类作用-->
    <dependency>
        <groupId>com.github.kuhn-he</groupId>
        <artifactId>elastic-job-lite-spring-boot-starter</artifactId>
        <version>2.1.5</version>
    </dependency>
    
  • 配置elasticjob注册中心

    修改bootstrap.yml配置zookeeper服务地址信息以及注册的命名空间名字:

    elaticjob:
      zookeeper:
        server-lists: 127.0.0.1:2181
        namespace: synctask
    
  • 创建作业

    @ElasticSimpleJob(
            cron = "0/10 * * * * ?",
            jobName = "synctask",
            shardingTotalCount = 1
    )
    @Component
    public class SyncStaticTask implements SimpleJob {
    
        //执行的流程
        @Override
        public void execute(ShardingContext shardingContext) {
            System.out.println("elatic job执行静态任务。。。");
        }
    
    }
    
  • 测试

    直接启动spring boot项目即可。

    image-20211213130455702

3. 动态任务

操作步骤:

  • 注册当前服务-》ZK
  • 创建作业配置
    • jobName
    • shardingTotalCount
    • corn
  • 创建任务
  • 初始化启动任务
  • 首先在yml中添加相关配置信息

    #动态定时任务案例
    dynamiczk: 127.0.0.1:2181
    dynamicnamespace: dynamictask
    
  • 注册服务

    @Configuration
    public class DynamicConfig {
    
        @Value("${dynamiczk}")
        private String dynamiczk;
    
        @Value("${dynamicnamespace}")
        private String dynamicnamespace;
    
        /****
         * 指定当前注册地址信息
         */
        @Bean
        public ZookeeperConfiguration zookeeperConfiguration() {
            return new ZookeeperConfiguration(dynamiczk, dynamicnamespace);
        }
    
        /****
         * 向Zookeeper服务注册
         */
        @Bean(initMethod = "init")
        public ZookeeperRegistryCenter zookeeperRegistryCenter(ZookeeperConfiguration zookeeperConfiguration) {
            return new ZookeeperRegistryCenter(zookeeperConfiguration);
        }
    }
    
  • 创建作业调度

    @Component
    public class DynamicTaskCreate {
    
        @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) {
    
            //1.配置作业->Builder->构建:LiteJobConfiguration
            LiteJobConfiguration.Builder builder = LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(
                    JobCoreConfiguration.newBuilder(
                            jobName,
                            cron,
                            shardingTotalCount
                    ).jobParameter(parameters).build(),
                    instance.getClass().getName()
            )).overwrite(true); //overwrite 覆盖之前同名的任务
            LiteJobConfiguration liteJobConfiguration = builder.build();
    
            //2.开启作业
            new SpringJobScheduler(instance, zookeeperRegistryCenter, liteJobConfiguration).init();
        }
    }
    
  • 创建定时任务

    public class DynamicJob implements SimpleJob {
    
        //执行的作业
        @Override
        public void execute(ShardingContext shardingContext) {
    
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("elastic job 动态任务:" + simpleDateFormat.format(new Date()));
    
        }
    
    }
    
  • 测试

    自行创建测试类或者编写接口访问也行

    //创建任务调用,活动结束的时候执行
    //cron表达式就是将我们正常的时间反过来写就OK
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
    String cron = simpleDateFormat.format(seckillActivity.getEndTime());
    System.out.println("cron:" + cron);
    dynamicTaskCreate.create("jobname", cron, 1, new DynamicJob(), "param");
    

    image-20211213132135442

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐