elastic-job 定时任务 —— elasticjob 介绍与使用教程

文章目录

  • Elastic-Job 介绍
  • 相关依赖
  • elastic-job 目录结构
  • SimpleJob 简单作业编码
    • 下载并启动 ZooKeeper
    • 编写定时任务代码并启动


Elastic-Job 介绍

概述:

Elastic-Job 是当当网开源的一个分布式调度解决方案,基于 Quartz 二次开发的,由两个相互独立的子项目 ElasticJob-Lite 和 Elastic-Job-Cloud 组成。ElasticJob-Lite 是一个轻量级无中心化的解决方案,它提供了分布式任务调度的核心功能,以 Jar 包的形式提供分布式任务的协调服务;而 Elastic-Job-Cloud 则是基于云环境下的分布式任务调度方案,需要结合 Mesos 和 Docker 使用,它采用了基于云原生的思想,以轻量级的微服务架构为基础,支持更大规模和复杂的分布式任务调度场景。
在这里插入图片描述
ElasticJob 是面向进程内的线程级调度框架。能够与 Spring 、Dubbo 等 Java 框架配合使用,在作业中可自由使用 Spring 注入的 Bean,如数据源连接池、Dubbo 远程服务等,更加方便的贴合业务开发。

弹性调度是 ElasticJob 最重要的功能,也是这款产品名称的由来。 它是一款能够让任务通过分片进行水平扩展的任务处理系统。

分片:

任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。

ElasticJob 中任务分片项的概念,使得任务可以在分布式的环境下运行,每台任务服务器只运行分配给该服务器的分片。随着服务器的增加或宕机,ElasticJob 会近乎实时的感知服务器数量的变更,从而重新为分布式的任务服务器分配更加合理的任务分片项,使得任务可以随着资源的增加而提升效率。

举例说明,如果作业分为 4 片,用两台服务器执行,则每个服务器分到 2 片,分别负责作业的 50% 的负载,如下图所示。
在这里插入图片描述


相关依赖

使用 ElasticJob 时,需要添加以下依赖包到项目中

引入 dangdang 依赖:

  1. 如果是简单 Java 项目,使用 elastic-job-lite-core 核心依赖:
    <dependency>
        <groupId>com.dangdang</groupId>
        <artifactId>elastic-job-lite-core</artifactId>
        <version>2.1.5</version>
    </dependency>
    
  2. 如果是集成到 Spring 框架中,使用 elastic-job-lite-spring 依赖,该依赖包含了 elastic-job-lite-core 核心依赖:
    <dependency>
        <groupId>com.dangdang</groupId>
        <artifactId>elastic-job-lite-spring</artifactId>
        <version>2.1.5</version>
    </dependency>
    

ElasticJob 已于 2020 年 5 月 28 日成为 Apache ShardingSphere 的子项目。当当更新到 2.1.5 版本,捐赠到 Apache 后,包名变更,从 3.0.0 版本开始更新:

  1. 如果是简单 Java 项目,使用 elasticjob-lite-core 核心依赖:(注意在加入 Apache 后 elastic-job 少了 “-” 变为 elasticjob)
    <dependency>
        <groupId>org.apache.shardingsphere.elasticjob</groupId>
        <artifactId>elasticjob-lite-core</artifactId>
        <version>3.0.4</version>
    </dependency>
    
  2. 如果是集成到 Spring 框架中,使用 elasticjob-lite-spring-core 依赖,该依赖包含了 elasticjob-lite-core 核心依赖:
    <dependency>
        <groupId>org.apache.shardingsphere.elasticjob</groupId>
        <artifactId>elasticjob-lite-spring-core</artifactId>
        <version>3.0.4</version>
    </dependency>
    
  3. 如果是集成到 Spring Boot 中,使用 elasticjob-lite-spring-boot-starter 启动器依赖,简化了在 Spring Boot 项目中使用 ElasticJob 的配置和依赖管理,提供了默认的配置和自动装配。
    <dependency>
        <groupId>org.apache.shardingsphere.elasticjob</groupId>
        <artifactId>elasticjob-lite-spring-boot-starter</artifactId>
        <version>3.0.4</version>
    </dependency>
    

elastic-job 目录结构

elastic-job
    ├──elastic-job-lite                                 lite父模块,不应直接使用
    ├      ├──elastic-job-lite-core                     Java支持模块,可直接使用
    ├      ├──elastic-job-lite-spring                   Spring命名空间支持模块,可直接使用
    ├      ├──elastic-job-lite-lifecyle                 lite作业相关操作模块,不可直接使用
    ├      ├──elastic-job-lite-console                  lite界面模块,可直接使用
    ├──elastic-job-example                              使用示例
    ├      ├──elastic-job-example-embed-zk              供示例使用的内嵌ZK模块
    ├      ├──elastic-job-example-jobs                  作业示例
    ├      ├──elastic-job-example-lite-java             基于Java的使用示例
    ├      ├──elastic-job-example-lite-spring           基于Spring的使用示例
    ├      ├──elastic-job-example-lite-springboot       基于SpringBoot的使用示例
    ├──elastic-job-doc                                  markdown生成文档的项目,使用方无需关注
    ├      ├──elastic-job-lite-doc                      lite相关文档

elastic-job-lite-core:

  • 这是 ElasticJob-Lite 的核心模块,提供了 ElasticJob 的核心功能。
  • 包含了分布式任务调度的基本功能,如任务的注册、启动、暂停、恢复、停止等。
  • 支持多种作业类型,如简单作业(Simple Job)、数据流作业(Dataflow Job)和脚本作业(Script Job)等。
  • 提供了分片策略、任务执行器等相关接口和实现。

elastic-job-lite-spring:

  • 这是 ElasticJob-Lite 的 Spring 整合模块,用于与 Spring 框架集成。
  • 提供了与 Spring 的无缝集成,可以通过 Spring 的配置文件或注解来定义和管理 ElasticJob 的作业。
  • 支持通过 Spring 的方式配置和管理 ElasticJob 的作业信息、触发器、分片策略等。

elastic-job-lite-lifecycle:

  • 这是 ElasticJob-Lite 的生命周期模块,用于管理作业的生命周期。
  • 提供了在作业启动和关闭时执行一些额外的操作的扩展点。
  • 可以通过实现相应的接口,在作业启动和关闭时执行自定义的逻辑,如初始化资源、清理资源等。

elastic-job-lite-console:

  • 这是 ElasticJob-Lite 的控制台模块,用于提供可视化界面管理 ElasticJob。
  • 可直接使用该模块来搭建一个 Web 界面,用于管理和监控 ElasticJob 的作业。
  • 提供了作业配置、作业状态监控、作业运行日志等功能。

SimpleJob 简单作业编码

ElasticJob 调度器分为定时调度和一次性调度两种类型。 每种调度器启动时均需要注册中心配置、作业对象(或作业类型)以及作业配置这 3 个参数。

以下测试是在 windows 环境下进行。

下载并启动 ZooKeeper

这里下载 ZooKeeper 3.8.4 版本为例,需要下载的可以关注 【Qin的学习营地】公众号,回复【Zookeeper安装包】,包含安装包及源码。

1、解压安装包,找到解压目录下的 conf 目录,复制该目录下的 zoo_sample.cfg 文件,并重命名为 zoo.cfg。
在这里插入图片描述
2、根据需要修改 zoo.cfg 配置文件,比如将默认的数据存储路径 dataDir=/tmp/zookeeper 修改成自己的路径,还可以增加数据日志存储路径。
在这里插入图片描述

3、双击 bin 目录下的 zkServer.cmd,启动 Windows 环境下的 ZooKeeper 程序。
在这里插入图片描述

为什么需要做如上的配置操作,我们进入 bin 目录下,找到 zkEnv.cmd 并以文本形式打开,可以看到环境配置,启动 ZooKeeper 时会去找 conf 目录下的 zoo.cfg 配置文件。
在这里插入图片描述

编写定时任务代码并启动

这里集成到 Spring 框架中使用,并使用当当网下的依赖,所以引入 elastic-job-lite-spring 依赖。

<dependency>
    <groupId>com.dangdang</groupId>
    <artifactId>elastic-job-lite-spring</artifactId>
    <version>2.1.5</version>
</dependency>

任务接口实现

实现 SimpleJob 接口,该接口仅提供单一方法,此方法将定时执行。重写该方法,编写自己的业务逻辑代码。

@Component
@Qualifier("myJob")
public class MyJob implements SimpleJob {

    @Override
    public void execute(ShardingContext context) {
        switch (context.getShardingItem()) {
            case 0:
                System.out.println("执行分片0,dateTime:" + new Date(System.currentTimeMillis()));
                break;
            case 1:
                System.out.println("执行分片1,dateTime:" + new Date(System.currentTimeMillis()));
                break;

        }
    }
}

创建 Job 实例、注册配置及启动

1、注册中心配置

  • 用于注册和协调作业分布式行为的组件,目前仅支持 ZooKeeper。

  • 类名称:org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperConfiguration

    // zookeeper 服务器列表 "localhost:2181"
    // zookeeper 命名空间 "elastic-job-demo-zoo"
    CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration("localhost:2181"
        , "elastic-job-demo-zoo"));
    regCenter.init();
    

2、作业配置

  • ElasticJob 采用构建器模式创建作业配置对象。

  • 类名称:org.apache.shardingsphere.elasticjob.api.JobConfiguration

    // 定义作业核心配置
    // 作业名称:"demoSimpleJob"、 CRON 表达式,控制作业触发时间:"0/15 * * * * ?"、 作业分片总数:2
    JobCoreConfiguration simpleCoreConfig =
        JobCoreConfiguration.newBuilder("demoSimpleJob", "0/15 * * * * ?", 2).build();
    // 定义 SIMPLE 类型配置
    SimpleJobConfiguration simpleJobConfig =
        new SimpleJobConfiguration(simpleCoreConfig, myJob.getClass().getCanonicalName());
    // 定义 Lite 作业根配置
    LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build();
    

3、创建 Job 实例

  • 创建 Job 实例

  • 注册上述配置的注册中心、作业配置

  • 启动运行实例

    @Bean(initMethod = "init")
    public JobScheduler jobDemo() {
    System.out.println("jobDemo");
        // 注册中心、job配置,JobScheduler init 方法启动
        JobScheduler jobScheduler = new JobScheduler(createRegistryCenter(), createJobConfiguration());
        return jobScheduler;
    }
    
    //    @Bean
    //    public void jobDemo1() {
    //        System.out.println("执行 jobDemo1");
    //        new JobScheduler(createRegistryCenter(), createJobConfiguration()).init();
    //    }
    

完整代码:

@Configuration
public class JobConfig {

    @Autowired
    @Qualifier("myJob")
    private SimpleJob myJob;

    @Bean(initMethod = "init")
    public JobScheduler jobDemo() {
    System.out.println("jobDemo");
        // 注册中心、job配置,JobScheduler init 方法启动
        JobScheduler jobScheduler = new JobScheduler(createRegistryCenter(), createJobConfiguration());
        return jobScheduler;
    }

//    @Bean
//    public void jobDemo1() {
//        System.out.println("执行 jobDemo1");
//        new JobScheduler(createRegistryCenter(), createJobConfiguration()).init();
//    }

    private CoordinatorRegistryCenter createRegistryCenter() {
        // zookeeper 服务器列表 "localhost:2181"
        // zookeeper 命名空间 "elastic-job-demo-zoo"
        CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration("localhost:2181"
            , "elastic-job-demo-zoo"));
        regCenter.init();
        return regCenter;
    }

    private LiteJobConfiguration createJobConfiguration() {
        // 定义作业核心配置
        // 作业名称:"demoSimpleJob"、 CRON 表达式,控制作业触发时间:"0/15 * * * * ?"、 作业分片总数:2
        JobCoreConfiguration simpleCoreConfig =
            JobCoreConfiguration.newBuilder("demoSimpleJob", "0/15 * * * * ?", 2).build();
        // 定义 SIMPLE 类型配置
        SimpleJobConfiguration simpleJobConfig =
            new SimpleJobConfiguration(simpleCoreConfig, myJob.getClass().getCanonicalName());
        // 定义 Lite 作业根配置
        LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build();
        return simpleJobRootConfig;
    }
}

启动 spring boot 服务,运行结果:

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

一个任务可以拆分为多个独立的分片项,分布式的服务器分别执行某一个或几个分片项。这里每隔 15s 执行一次任务。
在这里插入图片描述

详细官方文档资料,需要下载的可以关注 【Qin的学习营地】公众号,回复【elasticjob官方文档】
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/780473.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科普新能源充电桩

充电桩是新能源电动车的配套基础设施&#xff0c;为电动车提供充电服务&#xff0c;与我们的生活也是息息相关&#xff0c;本篇文章来科普一下充电桩基础知识。 充电桩的分类 按照供电方式分类 交流充电桩&#xff1a;特点是小电流、桩体较小、安装灵活&#xff1b;直流充电…

Linux shell编程学习笔记63:free命令 获取内存使用信息

0 前言 在系统安全检查中&#xff0c;内存使用情况也是一块可以关注的内容。Linux提供了多个获取内存信息的命令很多。今天我们先研究free命令。 1 free命令的功能、用法和选项说明 1.1 free命令的功能 free 命令可以显示系统内存的使用情况&#xff0c;包括物理内存、交换…

论文1:多模态人类活动识别综述

论文题目&#xff1a;A Review of Multimodal Human Activity Recognition with Special Emphasis on Classification, Applications, Challenges and Future Directions 文献偏旧-2021 1、 专业词汇&#xff1a; Human activity recognition (HAR)-人类活动识别 Wearable …

android中activity与fragment之间的各种跳转

我们以音乐播放、视频播放、用户注册与登录为例【Musicfragment&#xff08;音乐列表页&#xff09;、Videofragment&#xff08;视频列表页&#xff09;、MusicAvtivity&#xff08;音乐详情页&#xff09;、VideoFragment&#xff08;视频详情页&#xff09;、LoginActivity&…

时钟资源(参考ug472)

目录 时钟资源(参考ug472)7系列 FPGA 时钟连接差异时钟资源连接关系表时钟资源连接示意图不同时钟区域资源连接图Clock-Capable Inputs介绍布局规则 全局时钟 bufferBUFGCTRL介绍原语参数及端口INIT_OUTPRESELECT_I0/1I0/1CE0/1S0/1IGNORE0/1 真值表时序 BUFGBUFGCE&#xff0c…

日本服务器托管需要注意哪些问题

日本服务器托管是一项涉及多方面因素的重要决策&#xff0c;为了确保托管服务的稳定、高效与安全&#xff0c;企业或个人在托管过程中需要注意以下几个关键问题&#xff1a; 首先&#xff0c;数据中心的基础设施建设标准是决定托管稳定性的关键。这包括数据中心的建筑抗震、抗洪…

单片机关键任务优先级的实现学习

与总体产品联调时&#xff0c;需要各个单机系统严格按照总体要求&#xff0c;进行数据输出&#xff0c;时间的偏差将出现系统异常&#xff0c;控制失败等不稳定情况产生&#xff0c;甚至影响到产品安全。 因此必须确保某些关键任务的优先执行。单片机任务优先级一般有两种方式…

Java 基础知识之 switch 语句和 yield 关键字

传统 switch 语句 传统的 switch 语句我们已经写了一万遍了&#xff0c;以下是一个典型的 switch 语句&#xff1a; int dayOfWeek 3; switch (dayOfWeek) {case 1:System.out.println("星期一");break;case 2:System.out.println("星期二");break;case…

STM32-I2C

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. I2C通信1.1 I2C通信简介1.2 硬件电路1.3 I2C时序基本单元1.3.1 起始条件和终止条件1.3.2 发送一个字节1.3.3 接收一个字节1.3.4 发送应答和接收应答 1.4 I2C时序1.4.1 指定地址写1.4.2 当前地址读1.4.3 指定地址读…

Java应用系统设计与实现--学生信息管理系统(附解决方案源码)

一、实验目的及要求 1.1实验目的 掌握Java GUI编程技术&#xff0c;了解Swing框架的使用。 掌握MySQL数据库的基本操作&#xff0c;了解如何在Java中连接和操作数据库。 掌握用户权限管理的基本概念和实现方法。 提升综合运用所学知识设计和实现一个完整应用系统的能力…

QThread moveToThread的妙用

官方文档描述 总结就是移动到线程的对象不能有父对象&#xff0c;执行start即起一个线程&#xff0c;示例是将myObject移动到主线程中。QT中这种方式起一个线程是非常简单的。 示例描述以及代码 描述往Communicate线程中频繁添加任务&#xff0c;等任务结束的时候统计计算的结…

【python教程】数据分析——numpy、pandas、matplotlib

【python教程】数据分析——numpy、pandas、matplotlib 文章目录 什么是matplotlib安装matplotlib&#xff0c;画个折线 什么是matplotlib matplotlib:最流行的Python底层绘图库&#xff0c;主要做数据可视化图表,名字取材于MATLAB&#xff0c;模仿MATLAB构建 安装matplotlib&…

Node 中基于 Koa 框架的 Web 服务搭建实战

前言 在《Node之Web服务 - 掘金 (juejin.cn)》一文中,我们使用 HTTP 模块构建了后端接口,从而实现了后端服务的开发。可以对此进行进一步优化 http模块代码回顾 const http require("http");const server http.createServer((req, res) > {if (reqUrl.pathna…

【面试八股文】java基础知识

引言 本文是java面试时的一些常见知识点总结归纳和一些拓展&#xff0c;笔者在学习这些内容时&#xff0c;特地整理记录下来&#xff0c;以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类&#xff0c;Integer和int区别是什么&#xff1f; 使用封装类的目的 对象化:…

阶段三:项目开发---搭建项目前后端系统基础架构:任务13:实现基本的登录功能

任务描述 任务名称&#xff1a; 实现基本的登录功能 知识点&#xff1a; 了解前端Vue项目的基本执行过程 重 点&#xff1a; 构建项目的基本登陆功能 内 容&#xff1a; 通过实现项目的基本登录功能&#xff0c;来了解前端Vue项目的基本执行过程&#xff0c;并完成基…

前端面试题17(js快速检索方法详解)

在前端JavaScript中&#xff0c;快速检索数据通常涉及到数组或对象的搜索。这里我会介绍几种常见的快速检索方法&#xff0c;并提供相应的代码示例。 1. 数组的find和findIndex方法 find: 返回数组中满足条件的第一个元素的值。findIndex: 返回数组中满足条件的第一个元素的索…

基于LSTM的股票价格预测

摘要 本课设旨在利用LSTM&#xff08;长短期记忆&#xff09;网络实现股票价格预测&#xff0c;通过收集、预处理股票数据集&#xff0c;并构建预测模型进行训练与优化。实验结果显示&#xff0c;经过优化调整模型参数&#xff0c;模型在测试集上取得了较为理想的预测效果。尽…

《征服数据结构》SparseArray

摘要&#xff1a; 1&#xff0c;SparseArray的介绍 2&#xff0c;SparseArray的代码实现 1&#xff0c;SparseArray的介绍 前面我们讲过《ArrayMap》&#xff0c;用它来实现哈希表&#xff0c;其中存放key和value的数组长度是存放散列表数组长度的二倍。 在哈希表中如果key值是…

SwiftData 模型对象的多个实例在 SwiftUI 中不能及时同步的解决

概览 我们已经知道,用 CoreData 在背后默默支持的 SwiftUI 视图在使用 @FetchRequest 来查询托管对象集合时,若查询结果中的托管对象在别处被改变将不会在 FetchedResults 中得到及时的刷新。 那么这一“囧境”在 SwiftData 里是否也会“卷土重来”呢?空说无益,就让我们在…

【项目设计】负载均衡式——Online Judge

负载均衡式——Online Judge&#x1f60e; 前言&#x1f64c;Online Judge 项目一、项目介绍二、项目技术栈三、项目使用环境四、项目宏观框架五、项目后端服务实现过程1、comm模块设计1.1 Log.hpp实现1.2 Util.hpp实现 2、compiler_server 模块设计2.1compile.hpp文件代码编写…