Spring boot 集成 Elastic-job 实现定时任务

Spring boot 集成 Elastic-job 实现定时任务,第1张

Spring boot 集成 Elastic-job 实现定时任务 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当当网个人个人个人高级功能—d性扩容,多种作业模式,失效转移,运行状态收集,多线程处理数据,幂等性,容错处理,spring命名空间支持d性扩容,分片广播,故障转移,Rolling实时日志,GLUE(支持在线编辑代码,免发布),任务进度监控,任务依赖,数据加密,邮件报警,运行报表,国际化任务分片, 失效转移,d性扩容 ,时间规则支持quartz和crontab ,kill任务, 现场执行,查询任务运行状态使用企业大众化产品,对分布式调度要求不高的公司大面积使用36氪,当当网,国美,金柚网,联想,唯品会,亚信,平安,猪八戒大众点评,运满满,优信二手车,拍拍贷——

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

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

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

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

2. 静态任务

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

*** 作步骤:

  • 1.执行周期

  • 2.分片

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

  • 引入依赖

    
    
        com.github.kuhn-he
        elastic-job-lite-spring-boot-starter
        2.1.5
    
    
  • 配置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项目即可。

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);
        }
    
        
        @Bean(initMethod = "init")
        public ZookeeperRegistryCenter zookeeperRegistryCenter(ZookeeperConfiguration zookeeperConfiguration) {
            return new ZookeeperRegistryCenter(zookeeperConfiguration);
        }
    }
    
  • 创建作业调度

    @Component
    public class DynamicTaskCreate {
    
        @Autowired
        private ZookeeperRegistryCenter zookeeperRegistryCenter;
    
        
        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");
    

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5668972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存