• Springboot + Elasticjob-lite 3.x + Elasticjob-lite-UI可视化


    关于ElasticJob

    ElasticJob 曾作为当当旗下的开源产品大受欢迎,和 xxl-job 一样都是基于 Quartz 实现的定时调度平台。后来停止运维了几年,最近两年又开始重新维护并成为了 apache 的子项目。
    官网地址
    根据官网的介绍,Elasticjob具有以下功能(包含开发中的功能):

    • 弹性调度
      • 支持任务在分布式场景下的分片和高可用
      • 能够水平扩展任务的吞吐量和执行效率
      • 任务处理能力随资源配备弹性伸缩
    • 资源分配
      • 在适合的时间将适合的资源分配给任务并使其生效
      • 相同任务聚合至相同的执行器统一处理
      • 动态调配追加资源至新分配的任务
    • 作业治理
      • 失效转移
      • 错过作业重新执行
      • 自诊断修复
    • 作业依赖(TODO)
      • 基于有向无环图(DAG)的作业间依赖
      • 基于有向无环图(DAG)的作业分片间依赖
    • 作业开放生态
      • 可扩展的作业类型统一接口
      • 丰富的作业类型库,如数据流、脚本、HTTP、文件、大数据等
      • 易于对接业务作业,能够与 Spring 依赖注入无缝整合
    • 可视化管控端
      • 作业管控端
      • 作业执行历史数据追踪
      • 注册中心管理

    DEMO

    环境要求

    JAVAJava 8 及其以上版本
    MAVEN3.5.0及其以上版本
    Zookeeper3.6.0及其以上版本

    Demo

    pom.xml
    		...
            <dependency>
                <groupId>org.apache.shardingsphere.elasticjob</groupId>
                <artifactId>elasticjob-lite-spring-boot-starter</artifactId>
                <version>3.0.1</version>
            </dependency>
            ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    创建作业

    简单作业

    import lombok.extern.slf4j.Slf4j;
    import org.apache.shardingsphere.elasticjob.api.ShardingContext;
    import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob;
    import org.springframework.stereotype.Component;
    
    @Slf4j
    @Component
    public class MyElasticJob implements SimpleJob {
        /**
         * 要调度的具体任务,时间段轮循
         */
        @Override
        public void execute(ShardingContext shardingContext) {
            log.info(String.format("定时任务-测试%s %s %d",shardingContext.getJobName(),shardingContext.getTaskId() ,shardingContext.getShardingItem()));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    数据流作业

    import lombok.SneakyThrows;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.shardingsphere.elasticjob.api.ShardingContext;
    import org.apache.shardingsphere.elasticjob.dataflow.job.DataflowJob;
    import org.springframework.stereotype.Component;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    @Slf4j
    @Component
    public class SpringBootDataflowJob implements DataflowJob<String> {
    
        @Override
        public List<String> fetchData(final ShardingContext shardingContext) {
            List<String> dex = new ArrayList<>();
            dex.add(UUID.randomUUID().toString());
            dex.add(UUID.randomUUID().toString());
            dex.add(UUID.randomUUID().toString());
            return dex;
        }
    
        @SneakyThrows
        @Override
        public void processData(final ShardingContext shardingContext, final List<String> data) {
            for (String each : data) {
                log.info(String.format("定时任务-测试%s %s %d %s",shardingContext.getJobName(),shardingContext.getTaskId() ,shardingContext.getShardingItem(),each));
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    使用 Spring Boot Starter 的方式配置作业

    环境配置文件中添加配置:spring.profiles.include=job

    server:
      port: 15999
    spring:
      profiles:
        include: job
      application:
        name: elastic-service
      datasource:
        url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:3306}/elastic_job?serverTimezone=GMT%2B8&autoReconnect=true&useUnicode=true&characterEncoding=UTF8&useSSL=false
        driverClassName: com.mysql.cj.jdbc.Driver
        username: root
        password: password
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    添加application-job.yml

    elasticjob:
      reg-center:
        serverLists: 127.0.0.1:2181
        namespace: elastic-job-lite
        base-sleep-time-milliseconds: 1000
        max-sleep-time-milliseconds: 3000
        max-retries: 3
      jobs:
        testJobCronTrigger1:
          elasticJobClass: com.dm.cloud.tasks.MyElasticJob
          cron: 0/15 * * * * ?
          timeZone: GMT+08:00
          shardingTotalCount: 3
          shardingItemParameters: 0=0,1=1,2=2
        testJobCronTrigger2:
          elasticJobClass: com.dm.cloud.tasks.SpringBootDataflowJob
          cron: 0 0/30 * * * ?
          timeZone: GMT+08:00
          shardingTotalCount: 1
          shardingItemParameters: 0=0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    启动项目

    启动项目等待作业运行
    可以启动多个项目键查看分片执行是否正常在这里插入图片描述

    可视化安装

    下载源码
    正常按照官方提示就操作就可以了

    但是我这里失败了。。。
    原因大致是因为在处理前端的时候时候缺各种命令,搜索之后无果,本人对前端环境这块接触较少,而且要添加 mysqljdbc 驱动,要不然前端UI界面选不到mysql驱动,添加不了mysql数据源,最后决定自己修改代码打包发布。

    后端打包启动

    修改pom文件,添加mysql数据驱动,修改maven扩展

     <dependencies>
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>8.0.13</version>
         </dependency>
     </dependencies>
    ...
     <build>
        <finalName>shardingsphere-elasticjob-lite-ui</finalName>
          <plugins>
          ...
              <plugin>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-maven-plugin</artifactId>
                  <version>${spring-boot.version}</version>
                  <executions>
                      <execution>
                          <goals>
                              <goal>repackage</goal>
                          </goals>
                      </execution>
                  </executions>
              </plugin>
          </plugins>
     </build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    修改 application.properties,这一句解屏蔽,并添加 com.mysql.cj.jdbc.Driver

    ## Uncomment the following property to allow adding DataSource dynamically.
    dynamic.datasource.allowed-driver-classes={'org.h2.Driver','org.postgresql.Driver','com.mysql.cj.jdbc.Driver'}
    
    • 1
    • 2

    执行命令打包

    mvn clean package -Dmaven.test.skip=true
    
    • 1

    然后 java -jar 启动服务

    前端打包部署

    前端打包

    cd ./shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend
    npm install
    npm run build
    
    • 1
    • 2
    • 3

    然后会生成一个 dist 文件夹。
    nginx 发布一下服务

    server{
      listen 2137;
      server_name elastic.test.com;
      location / {
        root E:/,,,0PersonalPro/elasticjob/shardingsphere-elasticjob-ui/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/dist;
        index index.html;
      }
      location ^~ /api/{
        proxy_pass http://127.0.0.1:8088/api/;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    访问前端

    访问 http://localhost:2137/#/data-source
    默认用户名密码 root root

    添加注册中心
    在这里插入图片描述
    添加事件追踪
    这里的 mysql 驱动就是我们通过修改代码后添加的,默认只有 h2postgresql
    在这里插入图片描述
    在这里插入图片描述
    作业维度
    可以查看作业状态等信息,也可以修改作业配置
    在这里插入图片描述
    服务器纬度
    可以查看服务器作业信息
    在这里插入图片描述
    历史轨迹,历史状态
    查看作业的执行记录
    在这里插入图片描述

    问题记录

    1、代码修改配置文件不生效
    我出现的问题是在数据库连接上没有配置时区,导致历史记录里面的时间总是少八个小时
    链接上添加serverTimezone=GMT%2B8 ,设置为东八区一般就没有问题了。
    但是我修改之后时间仍不正确,最后通过清空 zookeeper 里面当前 namespace下的所有节点才好。

    deleteall /elastic-job-lite
    
    • 1
  • 相关阅读:
    Vivado下按键实验
    Python - Word转TXT文本,或TXT文本转Word
    【计算机网络】详解TCP协议(下) 滑动窗口 | 流量控制 | 拥塞控制
    测开要做的开发工作到底是做什么
    L298N双路驱动直流电机方案(支持PWM+正反转)
    统计学习方法第三章-k近邻法
    cesium 热力图(CesiumHeatmap)
    2024年五大科技与创业趋势:从AI退热到IPO挑战
    BEVFusion简介、环境配置与安装以及遇到的各种报错处理
    docker脚本镜像同步
  • 原文地址:https://blog.csdn.net/qq_40096897/article/details/126745502