elastic-job静动态定时任务实现

368 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

每日英语:

Years may wrinkle the skin, but to give up enthusiasm wrinkles the soul.

翻译:岁月悠悠,衰微只及肌肤;热忱抛却,颓废必至灵魂。 ——塞缪尔·厄尔曼

elastic-job介绍

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

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 的子项目。

1609819019238.png

elastic-job静态定时任务

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

后面执行定时更新静态页,我们可以在canal服务中执行操作。

1)引入依赖包

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

2)配置elasticjob注册中心

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

elaticjob:
  zookeeper:
    server-lists: 192.168.xxx.xxx:2181
    namespace: synctask

3)创建作业

创建作业类com.xz.canal.task.statictask.SyncStaticTask,代码如下:

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

elastic-job动态定时任务

修改mall-canal-service的核心配置文件,添加zookeeper服务信息,配置如下:

#动态定时任务案例
dynamiczk: 192.168.xxx.xxx:2181
dynamicnamespace: dynamictask

向Zookeeper注册信息,创建com.xz.canal.job.dynamic.DynamicConfig代码如下:

@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);
    }
}

作业调度创建com.xz.canal.job.dynamic.DynamicTaskCreate,代码如下:

@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);
        LiteJobConfiguration liteJobConfiguration = builder.build();
​
        //2.开启作业
        new SpringJobScheduler(instance,zookeeperRegistryCenter,liteJobConfiguration).init();
    }
}

总结

本篇主要介绍了一下elastic-job跟其他主流分布式任务调度的对比,还有其静态定时任务和动态定时任务的简单实现。