1. 介绍

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

featurequartzelastic-jobxxl-jobantaresopencron
依赖mysqljdk1.7+, zookeeper 3.4.6+ ,maven3.0.4+mysql ,jdk1.7+ , maven3.0+jdk 1.7+ , redis , zookeeperjdk1.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全生命周期开发者社区

更多推荐