乐趣区

关于spring:Spring-Boot-整合定时任务可以动态编辑的定时任务

定时工作,松哥之前写过多篇文章和大家介绍,上次还本人 DIY 了一个能够动静编辑的定时工作,还录了一个配套视频:

相干的材料链接戳这里:

  1. Spring 定时工作玩出花!
  2. 手把手教你定制可编辑的定时工作!
  3. 开发可配置的定时工作~第二弹
  4. Vue 非典型用法,一个简略的治理页面

不过咱们过后本人写的这个不反对分布式环境,想要反对倒也不是啥难事,弄一个 zookeeper 或者 redis 作为公共的信息中心,里边记录了定时工作的各种运行状况,有了这个就能反对分布式环境了。

明天咱们不本人写了,咱们来看一个现成的框架:ElasticJob,有一个跟他齐名的 xxljob,这个咱们当前再抽空介绍。

1. ElasticJob

1.1 简介

ElasticJob 是一个分布式作业调度解决方案,它的官网是:

  • http://shardingsphere.apache….

Elastic Job 的前身是由当当开源的一款分布式任务调度框架 dd-job,不过在 2020 年 5 月 28 日退出到了 Apache 基金会,成为 Apache 下的一个开源我的项目:

  • https://shardingsphere.apache…

ElasticJob 通过弹性调度、资源管控、以及作业治理的性能,打造一个实用于互联网场景的散布式调度解决方案,并通过凋谢的架构设计,提供多元化的作业生态。

应用 ElasticJob 可能让开发工程师不再放心工作的线性吞吐量晋升等非性能需要,使他们可能更加专一于面向业务编码设计;同时,它也可能解放运维工程师,使他们不用再放心工作的可用性和相干治理需要,只通过轻松的减少服务节点即可达到自动化运维的目标。

ElasticJob 是面向互联网生态和海量工作的散布式调度解决方案,由两个互相独立的子项目 ElasticJob-LiteElasticJob-Cloud 组成。

其中 ElasticJob-Lite 定位为轻量级无中心化解决方案,应用 jar 的模式提供分布式工作的协调服务:

ElasticJob-Cloud 则采纳自研 Mesos Framework 的解决方案,额定提供资源治理、利用散发以及过程隔离等性能:

ElasticJob-Lite VS ElasticJob-Cloud

ElasticJob-Lite ElasticJob-Cloud
无中心化
资源分配 不反对 反对
作业模式 常驻 常驻 + 刹时
部署依赖 ZooKeeper ZooKeeper + Mesos

它的各个产品应用对立的作业 API,开发者仅需一次开发,即可随便部署(即 ElasticJob-LiteElasticJob-Cloud 应用雷同的 API,次要是部署形式不同而已)。

1.2 性能列表

  • 弹性调度

    • 反对工作在分布式场景下的分片和高可用
    • 可能程度扩大工作的吞吐量和执行效率
    • 工作解决能力随资源装备弹性伸缩
  • 资源分配

    • 在适宜的工夫将适宜的资源分配给工作并使其失效
    • 雷同工作聚合至雷同的执行器对立解决
    • 动静调配追加资源至新调配的工作
  • 作业治理

    • 生效转移
    • 错过作业从新执行
    • 自诊断修复
  • 作业依赖 (TODO)

    • 基于有向无环图(DAG)的作业间依赖
    • 基于有向无环图(DAG)的作业分片间依赖
  • 作业凋谢生态

    • 可扩大的作业类型对立接口
    • 丰盛的作业类型库,如数据流、脚本、HTTP、文件、大数据等
    • 易于对接业务作业,可能与 Spring 依赖注入无缝整合
  • 可视化运维平台 (https://github.com/apache/sha…)

    • 作业管控端
    • 作业执行历史数据追踪
    • 注册核心治理

2. 实际

说了这么多,接下来咱们通过一个简略的案例来体验一把 ElasticJob 吧。毕竟有代码,感觉更实在。

首先咱们创立一个 Spring Boot 工程,引入 Web 依赖:

而后手动退出 ElasticJob 的 starter:

<dependency>
    <groupId>org.apache.shardingsphere.elasticjob</groupId>
    <artifactId>elasticjob-lite-spring-boot-starter</artifactId>
    <version>3.0.1</version>
</dependency>

接下来咱们创立一个作业,作业有几种不同的创立形式,咱们先来看一种基于实现 SimpleJob 接口创立的作业:

/**
 * @author 江南一点雨
 * @微信公众号 江南一点雨
 * @网站 http://www.itboyhub.com
 * @国内站 http://www.javaboy.org
 * @微信 a_java_boy
 * @GitHub https://github.com/lenve
 * @Gitee https://gitee.com/lenve
 */
@Component
public class MyFirstJob implements SimpleJob {private static final Logger logger = LoggerFactory.getLogger(MyFirstJob.class);
    @Override
    public void execute(ShardingContext shardingContext) {logger.info("作业名称:{};作业参数:{};分片总数:{};以后分片:{};分片参数:{};工作编号:{}",shardingContext.getJobName(),shardingContext.getJobParameter(),shardingContext.getShardingTotalCount(),shardingContext.getShardingItem(),shardingContext.getShardingParameter(),shardingContext.getTaskId());
    }
}

当定时工作执行的时候,execute 办法会被触发,其中参数 ShardingContext 中保留着定时工作相干的参数,这些参数都是咱们在 application.properties 中配置的,咱们持续来看:

elasticjob.reg-center.server-lists=zoo1:2181,zoo2:2182,zoo3:2183
elasticjob.reg-center.namespace=javaboy

elasticjob.jobs.my-first-job.elastic-job-class=org.javaboy.elasticjob.job.MyFirstJob
elasticjob.jobs.my-first-job.cron=0/3 * * * * ?
elasticjob.jobs.my-first-job.sharding-total-count=1
elasticjob.jobs.my-first-job.overwrite=true
elasticjob.jobs.my-first-job.job-parameter=hello javaboy!
elasticjob.jobs.my-first-job.sharding-item-parameters=0=A,1=B,2=C

这里的配置分为两大类:

  • 注册核心配置
  • 定时工作配置

应用 ElasticJob 须要注册核心 zookeeper,这个也好了解,因为 ElasticJob 反对工作在分布式场景下的分片和高可用,所以必然须要一个调度核心,这个 zk 就是调度核心。我这里开启了一个 zk 集群,里边有三个实例,三个 zk 地址之间用 , 隔开。同时咱们还要配置一个 namespace,这个 namespace 的作用是避免不同利用的定时工作抵触了,咱们给每个利用取一个不同于其余利用的 namespace,这样就不必放心抵触了。

接下来是配置作业。

配置作业的前缀对立是 elasticjob.jobs,紧接着就是作业的名称,这个作业名称能够随便配置,然而最好能一眼看进去是哪个作业,MyFirstJob#execute 办法中的 shardingContext.getJobName() 获取到的就是这个值。

咱们这里一共配置了六个属性,我来一一解释下:

  • elastic-job-class:作业的全门路。
  • cron:cron 表达式。
  • sharding-total-count:分片的总数,即有几个实例执行以后定时工作,MyFirstJob#execute 办法中的 shardingContext.getShardingTotalCount() 获取到的就是这个值。
  • overwrite:是否每次启动的时候笼罩之前的配置,如果设置为 false,则如果批改了 cron 表达式等,重启之后不会失效。
  • job-parameter:作业的参数,MyFirstJob#execute 办法中的 shardingContext.getJobParameter() 获取到的就是这个值。
  • sharding-item-parameters:分片的参数,0、1、2 别离示意第几个分片,MyFirstJob#execute 办法中的 shardingContext.getShardingParameter() 获取到的就是这个值。

好啦,当初就配置实现了。

3. 运行

当初咱们间接启动 Spring Boot 我的项目,启动之后,控制台就会打印如下日志:

没问题,每隔三秒钟打印一次日志。

当初咱们再次启动一个以后我的项目的实例,勾选 Allow parallel run 就能够启动多个实例(启动新实例时记得批改端口号):

当新的实例启动之后,咱们发现第一次启动的实例中曾经没有打印日志了,转而在第二次启动的实例中打印日志,这就是因为咱们配置的 sharding-total-count 为 1,即同一时间只有一个实例中的定时工作在运行。

3. 运维平台

ElasticJob 提供了一个运维平台,能够通过这个平台来动静治理定时工作,运维平台地址:

  • https://github.com/apache/shardingsphere-elasticjob-ui

运维平台应用步骤:

  1. 克隆我的项目下来:git clone https://github.com/apache/shardingsphere-elasticjob-ui.git
  2. 进入到目录中:cd shardingsphere-elasticjob-ui
  3. 打包:mvn clean package -Prelease
  4. 打包实现后,解压 shardingsphere-elasticjob-ui/shardingsphere-elasticjob-ui-distribution/shardingsphere-elasticjob-lite-ui-bin-distribution/target/apache-shardingsphere-elasticjob-3.1.0-SNAPSHOT-lite-ui-bin.tar.gz 文件,而后执行其 bin 目录下的 startup.sh 脚本启动。

下面第三步打包,因为网络起因很容易出错,所以小伙伴们要是打包失败,能够在公众号江南一点雨后盾回复 shardingsphere-elasticjob-ui,获取松哥打包好的文件。

运维平台启动之后,浏览器输出 http://localhost:8088 就会跳转到登录页面,如下:

默认的用户名明码都是 root。

注册胜利之后,先点击注册核心配置,而后抉择增加按钮,先来增加注册核心,增加完注册核心之后,这个运维平台会主动从注册核心上读取定时工作信息:

如实填写就行了,留神命名空间千万别写错了,写成了其余的就读取不到定时工作了。

接下来点击连贯按钮,建设和 zk 之间的连贯:

点击作业维度,就能够查看作业的详细信息,包含作业名称、分片总数、cron 表达式等:

最初面有四个操作按钮:

  • 批改:批改作业的详细信息,例如批改作业的 cron 表达式。
  • 详情:查看作业的详细信息。
  • 触发:触发作业的执行。
  • 生效:相当于暂停作业的执行,点击生效按钮之后,会呈现失效按钮,点击失效按钮,作业能够失效继续执行。
  • 终止:进行该作业。

点击服务器维度,能够查看服务器信息:

4. 小结

好啦,明天就通过一个简略的案例,和小伙伴们展现了一下 ElasticJob 的玩法,对于 ElasticJob 的其余玩法,咱们前面有空持续聊~

本文案例下载地址:https://github.com/lenve/javaboy-code-samples

退出移动版