Spring Boot 整合定时任务,可以动态编辑的定时任务
ccwgpt 2024-09-29 09:53 45 浏览 0 评论
首先我们来看一个现成的框架: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);
@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
运维平台使用步骤:
- 克隆项目下来:git clone https://github.com/apache/shardingsphere-elasticjob-ui.git。
- 进入到目录中:cd shardingsphere-elasticjob-ui。
- 打包:mvn clean package -Prelease。
- 打包完成后,解压 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
作者:江南一点雨
相关推荐
- 用Steam启动Epic游戏会更快吗?(epic怎么用steam启动)
-
Epic商店很香,但也有不少抱怨,其中一条是启动游戏太慢。那么,如果让Steam启动Epic游戏,会不会速度更快?众所周知,Steam可以启动非Steam游戏,方法是在客户端左下方点击“添加游戏”,然...
- Docker看这一篇入门就够了(dockerl)
-
安装DockerLinux:$curl-fsSLhttps://get.docker.com-oget-docker.sh$sudoshget-docker.sh注意:如果安装了旧版...
- AYUI 炫丽PC开发UI框架2016年6月15日对外免费开发使用 [1]
-
2016年6月15日,我AY对外发布AYUI(WPF4.0开发)的UI框架,开发时候,你可以无任何影响的去开发PC电脑上的软件exe程序。AYUI兼容XP操作系统,在Win7/8/8.1/10上都顺利...
- 别再说C#/C++套壳方案多了!Tauri这“借壳生蛋”你可能没看懂!
-
浏览器套壳方案,C#和C++有更多,你说的没错,从数量和历史积淀来看,C#和C++确实有不少方式来套壳浏览器,让Web内容在桌面应用里跑起来。但咱们得把这套壳二字掰扯清楚,因为这里面学问可大了!不同的...
- OneCode 核心概念解析——Page(页面)
-
在接触到OneCode最先接触到的就是,Page页面,在低代码引擎中,页面(Page)设计的灵活性是平衡“快速开发”与“复杂需求适配”的关键。以下从架构设计、组件系统、配置能力等维度,解析确...
- React是最后的前端框架吗,为什么这么说的?
-
油管上有一位叫Theo的博主说,React是终极前端框架,为什么这么说呢?让我们来看看其逻辑:这个标题看起来像假的,对吧?React之后明明有无数新框架诞生,凭什么说它是最后一个?我说的“最后一个”不...
- 面试辅导(二):2025前端面试密码:用3个底层逻辑征服技术官
-
面试官放下简历,手指在桌上敲了三下:"你上次解决的技术难题,现在回头看有什么不足?"眼前的候选人瞬间僵住——这是上周真实发生在蚂蚁金服终面的场景。2025年的前端战场早已不是框架熟练...
- 前端新星崛起!Astro框架能否终结React的霸主地位?
-
引言:当"背着背包的全能选手"遇上"轻装上阵的短跑冠军"如果你是一名前端开发者,2024年的框架之争绝对让你眼花缭乱——一边是React这位"背着全家桶的全能选...
- 基于函数计算的 BFF 架构(基于函数计算的 bff 架构是什么)
-
什么是BFFBFF全称是BackendsForFrontends(服务于前端的后端),起源于2015年SamNewman一篇博客文章《Pattern:BackendsFor...
- 谷歌 Prompt Engineering 白皮书:2025年 AI 提示词工程的 10 个技巧
-
在AI技术飞速发展的当下,如何更高效地与大语言模型(LLM)沟通,以获取更准确、更有价值的输出,成为了一个备受关注的问题。谷歌最新发布的《PromptEngineering》白皮书,为这一问题提供了...
- 光的艺术:灯具创意设计(灯光艺术作品展示)
-
本文转自|艺术与设计微信号|artdesign_org_cn“光”是文明的起源,是思维的开端,同样也是人类睁眼的开始。每个人在出生一刻,便接受了光的照耀和洗礼。远古时候,人们将光奉为神明,用火来...
- MoE模型已成新风口,AI基础设施竞速升级
-
机器之心报道编辑:Panda因为基准测试成绩与实际表现相差较大,近期开源的Llama4系列模型正陷入争议的漩涡之中,但有一点却毫无疑问:MoE(混合专家)定然是未来AI大模型的主流范式之一。...
- Meta Spatial SDK重大改进:重塑Horizon OS应用开发格局
-
由文心大模型生成的文章摘要Meta持续深耕SpatialSDK技术生态,提供开自去年9月正式推出以来,Meta持续深耕其SpatialSDK技术生态,通过一系列重大迭代与功能增强,不断革新H...
- "上云"到底是个啥?用"租房"给你讲明白IaaS/PaaS/SaaS的区别
-
半夜三点被机房报警电话惊醒,顶着黑眼圈排查服务器故障——这是十年前互联网公司运维的日常。而现在,程序员小王正敷着面膜刷剧,因为公司的系统全"搬"到了云上。"部署到云上"...
- php宝塔搭建部署thinkphp机械设备响应式企业网站php源码
-
大家好啊,欢迎来到web测评。本期给大家带来一套php开发的机械设备响应式企业网站php源码,上次是谁要的系统项目啊,帮你找到了,还说不会搭建,让我帮忙录制一期教程,趁着今天有空,简单的录制测试了一下...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 用Steam启动Epic游戏会更快吗?(epic怎么用steam启动)
- Docker看这一篇入门就够了(dockerl)
- AYUI 炫丽PC开发UI框架2016年6月15日对外免费开发使用 [1]
- 别再说C#/C++套壳方案多了!Tauri这“借壳生蛋”你可能没看懂!
- OneCode 核心概念解析——Page(页面)
- React是最后的前端框架吗,为什么这么说的?
- 面试辅导(二):2025前端面试密码:用3个底层逻辑征服技术官
- 前端新星崛起!Astro框架能否终结React的霸主地位?
- 基于函数计算的 BFF 架构(基于函数计算的 bff 架构是什么)
- 谷歌 Prompt Engineering 白皮书:2025年 AI 提示词工程的 10 个技巧
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)