首先我们来看一个现成的框架:ElasticJob,有一个跟他齐名的 xxljob,这个咱们以后再抽空介绍。

1. ElasticJob

1.1 简介

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

  • http://shardingsphere.apache.org/elasticjob

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

  • https://shardingsphere.apache.org/

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

使用 ElasticJob 能够让开发工程师不再担心任务的线性吞吐量提升等非功能需求,使他们能够更加专注于面 向业 务 编码设计;同时,它也能够解放运维工程师,使他们不必再担心任务的可用性和相关管理需求,只通过轻松的增加服务节点即可达到自动化运维的目的。

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

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

ElasticJob-Cloud 则采用自研 Mesos Framework 的解决方案,额外提供资源治理、应用分发以及进程隔离等功能:

ElasticJob-Lite VS ElasticJob-Cloud:

ElasticJob-LiteElasticJob-Cloud无中心化是否资源分配不支持支持作业模式常驻常驻 + 瞬时部署依赖ZooKeeperZooKeeper + Mesos

它的各个产品使用统一的作业 API,开发者仅需一次开发,即可随意部署(即 ElasticJob-Lite 和 ElasticJob-Cloud 使用相同的 API,主要是部署方式不同而已)。

1.2 功能列表

  • 弹性调度

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

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);@Overridepublic 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=javaboyelasticjob.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

来源:
https://mp.weixin.qq.com/s/IBvi-Feja3aQ_yw3ycjF2Q

作者:江南一点雨

Spring Boot 整合定时任务,可以动态编辑的定时任务2022-03-09 11:27·java互联网架构相关推荐

  1. Spring boot 整合Neo4j 实现动态Cypher

    提到spring boot整合Neo4j,一般都会提到spring-data-neo4j,使用类似于jpa的方式,使用entity去maintain,但是如果想要添加动态关系或者动态的node,就算是 ...

  2. 【任务篇】Spring Boot 整合 XXL-JOB 实现定时任务

    写在最前 之前介绍过[任务篇]Spring Boot 内置定时任务 Spring Task 实现定时任务,这次介绍 XXL-JOB 实现定时任务. XXL-JOB XXL-JOB 是一个分布式任务调度 ...

  3. spring boot整合cxf发布和调用webservice

    一.前言 说起web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是一些特有或相对老旧的系统依然使用了传统的soap web service,例 ...

  4. Spring Boot 整合MyBatis(23)

    Spring Boot 整合MyBatis Spring Boot 整合 Druid 引入依赖 配置 application.yml pring Boot 整合 tk.mybatis 引入依赖 配置 ...

  5. spring boot整合RabbitMQ —— 十分钟急速上手

    安装运行rabbitmq 1.docker安装rabbitmq: docker run -it --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq ...

  6. ElasticSearch教程与实战:从搭建服务到Spring Boot整合

    目录 写在前面 Elasticsearch是什么?可以解决什么问题? 关于Elasticsearch版本的选择 Elasticsearch的几个基本概念 索引(index) 类型(type) 文档(d ...

  7. spring boot 整合 云之讯 demo

    spring boot 整合 云之讯 demo ---恢复内容开始--- package com.zhourong.controller;import org.apache.commons.lang3 ...

  8. Spring Boot 整合 RabbitMQ 实现

    Spring Boot 整合 RabbitMQ 实现 1. 开发环境搭建 1.1 pom配置 1.2 application.yml配置 2. 消费者模块(springboot-rabbitmq-co ...

  9. Spring Boot 整合 Shiro(三)Kaptcha验证码 附源码

    前言 本文是根据上篇<Spring Boot 整合Shiro(二)加密登录与密码加盐处理>进行修改,如有不明白的转上篇文章了解. 1.导入依赖 <!-- https://mvnrep ...

  10. Spring boot整合jpa Jquery实现三级联动

    Spring boot 整合jpa JQuery 实现省,市,区, 三级联动效果 三级联动在很多项目都必不可少,尤其是在付款时,需要选取地址,为了更好的用户体验感,从而出现了三级联动. 实现三级联动的 ...

最新文章

  1. 洛谷 - P1111 - 修复公路 - 并查集
  2. Android ViewModel详解
  3. WatchOS系统开发大全(4)-WatchApp生命周期
  4. 关于货仓选址问题的方法及证明(在数轴上找一点使得该点到所有其他点的距离之和最小)...
  5. thinkPHP 数据库操作和分页类
  6. 退化函数及多种复原方法【Matlab】
  7. 修改端口_如何修改服务器的远程端口
  8. Linux内存管理:ARM64体系结构与编程之cache(1)
  9. asp.net三层架构制作新闻管理_为什么使用PHP制作网站?
  10. boost中的mutex与lock
  11. paip.JS的调试--DOM元素的属性与事件绑定
  12. RICOH 身份证 便捷打印
  13. 计算机知识与技能比赛活动总结,中职技能大赛总结(精选6篇)
  14. 数据科学的重要支柱——统计学的最佳入门书籍
  15. 在 Linux 上安装 Adobe Flash Player
  16. win10系统怎么做电影服务器,瞧瞧Win10是如何将电影推送到电视机上的
  17. 操作系统第五章——进程同步
  18. python连接校园网
  19. 嵌入式安全被忽视的 3 个原因
  20. PPT绘论文图之导出分辨率

热门文章

  1. 毕业设计——英文文献下载
  2. Base64解码后的图片打不开
  3. 案例解读|江苏银行—智多星大数据分析云平台实践
  4. OpenStack温哥华峰会Day2日记:大数据带你看峰会热点
  5. 吴恩达深度学习第一周课程学习笔记
  6. python数字雨代码_电影黑客帝国中代码雨如何实现?简单!用 Python 就能实现!...
  7. MFC Windows 程序设计[五]之绘制表格Accel
  8. Live2d vue 插件 将live2d引入vue工程 在网页上添加live2d模型
  9. 机器学习系列(2)_数据分析之Kaggle电影TMDB5000
  10. 学术搜索,Web Of Science 核心合集检索方法,SCI分区及影响因子查看方法