javascript
Spring Boot 整合定时任务,可以动态编辑的定时任务
首先我們來看一個(gè)現(xiàn)成的框架:ElasticJob,有一個(gè)跟他齊名的 xxljob,這個(gè)咱們以后再抽空介紹。
1. ElasticJob
1.1 簡介
ElasticJob 是一個(gè)分布式作業(yè)調(diào)度解決方案,它的官網(wǎng)是:
- http://shardingsphere.apache.org/elasticjob
Elastic Job 的前身是由當(dāng)當(dāng)開源的一款分布式任務(wù)調(diào)度框架 dd-job,不過在 2020 年 5 月 28 日加入到了 Apache 基金會(huì),成為 Apache 下 的 一個(gè)開源項(xiàng)目:
- https://shardingsphere.apache.org/
ElasticJob 通過彈性調(diào)度、資源管控、以及作業(yè)治理的功能,打造一個(gè)適用于互聯(lián)網(wǎng)場景的分布式調(diào)度解決方案,并通過開放的架構(gòu)設(shè)計(jì),提供多元化的作業(yè)生態(tài)。
使用 ElasticJob 能夠讓開發(fā)工程師不再擔(dān)心任務(wù)的線性吞吐量提升等非功能需求,使他們能夠更加專注于面 向業(yè) 務(wù) 編碼設(shè)計(jì);同時(shí),它也能夠解放運(yùn)維工程師,使他們不必再擔(dān)心任務(wù)的可用性和相關(guān)管理需求,只通過輕松的增加服務(wù)節(jié)點(diǎn)即可達(dá)到自動(dòng)化運(yùn)維的目的。
ElasticJob 是面向互聯(lián)網(wǎng)生態(tài)和海量任務(wù)的分布式調(diào)度解決方案,由兩個(gè)相互獨(dú)立的子項(xiàng)目?ElasticJob-Lite?和?ElasticJob-Cloud?組成。
其中?ElasticJob-Lite?定位為輕量級無中心化解決方案,使用 jar 的形式提供分布式任務(wù)的協(xié)調(diào)服務(wù):
ElasticJob-Cloud?則采用自研 Mesos Framework 的解決方案,額外提供資源治理、應(yīng)用分發(fā)以及進(jìn)程隔離等功能:
ElasticJob-Lite?VS?ElasticJob-Cloud:
ElasticJob-LiteElasticJob-Cloud無中心化是否資源分配不支持支持作業(yè)模式常駐常駐 + 瞬時(shí)部署依賴ZooKeeperZooKeeper + Mesos
它的各個(gè)產(chǎn)品使用統(tǒng)一的作業(yè) API,開發(fā)者僅需一次開發(fā),即可隨意部署(即?ElasticJob-Lite?和?ElasticJob-Cloud?使用相同的 API,主要是部署方式不同而已)。
1.2 功能列表
- 彈性調(diào)度
- 支持任務(wù)在分布式場景下的分片和高可用
- 能夠水平擴(kuò)展任務(wù)的吞吐量和執(zhí)行效率
- 任務(wù)處理能力隨資源配備彈性伸縮
- 資源分配
- 在適合的時(shí)間將適合的資源分配給任務(wù)并使其生效
- 相同任務(wù)聚合至相同的執(zhí)行器統(tǒng)一處理
- 動(dòng)態(tài)調(diào)配追加資源至新分配的任務(wù)
- 作業(yè)治理
- 失效轉(zhuǎn)移
- 錯(cuò)過作業(yè)重新執(zhí)行
- 自診斷修復(fù)
- 作業(yè)依賴(TODO)
- 基于有向無環(huán)圖(DAG)的作業(yè)間依賴
- 基于有向無環(huán)圖(DAG)的作業(yè)分片間依賴
- 作業(yè)開放生態(tài)
- 可擴(kuò)展的作業(yè)類型統(tǒng)一接口
- 豐富的作業(yè)類型庫,如數(shù)據(jù)流、腳本、HTTP、文件、大數(shù)據(jù)等
- 易于對接業(yè)務(wù)作業(yè),能夠與 Spring 依賴注入無縫整合
- 可視化運(yùn)維平臺(https://github.com/apache/shardingsphere-elasticjob-ui)
- 作業(yè)管控端
- 作業(yè)執(zhí)行歷史數(shù)據(jù)追蹤
- 注冊中心管理
2. 實(shí)踐
說了這么多,接下來我們通過一個(gè)簡單的案例來體驗(yàn)一把 ElasticJob 吧。畢竟有代碼,感覺更真實(shí)。
首先我們創(chuàng)建一個(gè) Spring Boot 工程,引入 Web 依賴:
然后手動(dòng)加入 ElasticJob 的 starter:
<dependency><groupId>org.apache.shardingsphere.elasticjob</groupId><artifactId>elasticjob-lite-spring-boot-starter</artifactId><version>3.0.1</version> </dependency>接下來我們創(chuàng)建一個(gè)作業(yè),作業(yè)有幾種不同的創(chuàng)建方式,我們先來看一種基于實(shí)現(xiàn) SimpleJob 接口創(chuàng)建的作業(yè):
/*** @author 江南一點(diǎn)雨* @微信公眾號 江南一點(diǎn)雨* @網(wǎng)站 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("作業(yè)名稱:{};作業(yè)參數(shù):{};分片總數(shù):{};當(dāng)前分片:{};分片參數(shù):{};任務(wù)編號:{}",shardingContext.getJobName(),shardingContext.getJobParameter(),shardingContext.getShardingTotalCount(),shardingContext.getShardingItem(),shardingContext.getShardingParameter(),shardingContext.getTaskId());} }當(dāng)定時(shí)任務(wù)執(zhí)行的時(shí)候,execute 方法會(huì)被觸發(fā),其中 參 數(shù) ShardingContext 中保存著定 時(shí)任 務(wù)相 關(guān)的參數(shù),這些參數(shù)都是我們在 application.properties 中 配置的,我們繼續(xù)來看:
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這里的配置分為兩大類:
- 注冊中心配置
- 定時(shí)任務(wù)配置
使用 ElasticJob 需要注冊中心 zookeeper,這個(gè)也好理解,因?yàn)?ElasticJob 支持任務(wù)在分布式場景下的分片和高可用,所以必然需要一個(gè)調(diào)度中心,這個(gè) zk 就是調(diào)度中心。我這里開啟了一 個(gè) zk 集群,里邊有三個(gè)實(shí)例,三個(gè) zk 地址之間用?,?隔開。同時(shí)我們還要配置一個(gè) namespace,這個(gè) namespace 的作用是防止不同應(yīng)用的定時(shí)任務(wù)沖突了,我們給每個(gè)應(yīng)用取一個(gè)不同于其他應(yīng)用的 namespace,這樣就不用擔(dān)心沖突了。
接下來是配置作業(yè)。
配置作業(yè)的前綴統(tǒng)一是?elasticjob.jobs,緊接著就是作業(yè)的名稱,這個(gè)作業(yè)名稱可以隨意配置,但是最好能一眼看出來是哪個(gè)作業(yè),MyFirstJob#execute?方法中的?
shardingContext.getJobName()?獲取到的就是這個(gè)值。
我們這里一共配置了六個(gè)屬性,我來一一解釋下:
- elastic-job-class:作業(yè)的全路徑。
- cron:cron 表達(dá)式。
- sharding-total-count:分片的總數(shù),即有幾個(gè)實(shí)例執(zhí)行當(dāng)前定時(shí)任務(wù),MyFirstJob#execute?方法中的?shardingContext.getShardingTotalCount()?獲取到的就是這個(gè)值。
- overwrite:是否每次啟動(dòng)的時(shí)候覆蓋之前的配置,如果設(shè)置為 false,則如果修改了 cron 表達(dá)式等,重啟之后不會(huì)生效。
- job-parameter:作業(yè)的參數(shù),MyFirstJob#execute?方法中的?shardingContext.getJobParameter()?獲取到的就是這個(gè)值。
- sharding-item-parameters:分片的參數(shù),0、1、2 分別表示第幾個(gè)分片,MyFirstJob#execute?方法中的?shardingContext.getShardingParameter()?獲取到的就是這個(gè)值。
好啦,現(xiàn)在就配置完成了。
3. 運(yùn)行
現(xiàn)在我們直接啟動(dòng) Spring Boot 項(xiàng)目,啟動(dòng)之后,控制臺就會(huì)打印如下日志:
沒問題,每隔三秒鐘打印一次日志。
現(xiàn)在我們再次啟動(dòng)一個(gè)當(dāng)前項(xiàng)目的實(shí)例,勾選?Allow parallel run?就可以啟動(dòng)多個(gè)實(shí)例(啟動(dòng)新實(shí)例時(shí)記得修改端口號):
當(dāng)新的實(shí)例啟動(dòng)之后,我們發(fā)現(xiàn)第一次啟動(dòng)的實(shí)例中已經(jīng)沒有打印日志了,轉(zhuǎn)而在第二次啟動(dòng)的實(shí)例中打印日志,這就是因?yàn)槲覀兣渲玫?sharding-total-count?為 1,即同一時(shí)間只有一個(gè)實(shí)例中的定時(shí)任務(wù)在運(yùn)行。
3. 運(yùn)維平臺
ElasticJob 提供了一個(gè)運(yùn)維平臺,可以通過這個(gè)平臺來動(dòng)態(tài)管理定時(shí)任務(wù),運(yùn)維平臺地址:
- https://github.com/apache/shardingsphere-elasticjob-ui
運(yùn)維平臺使用步驟:
上面第三步打包,由于網(wǎng)絡(luò)原因很容易出錯(cuò),所以小伙伴們要是打包失敗,可以在公眾號江南一點(diǎn)雨后臺回復(fù)?
shardingsphere-elasticjob-ui,獲取松哥打包好的文件。
運(yùn)維平臺啟動(dòng)之后,瀏覽器輸入?http://localhost:8088?就會(huì)跳轉(zhuǎn)到登錄頁面,如下:
默認(rèn)的用戶名密碼都是 root。
注冊成功之后,先點(diǎn)擊注冊中心配置,然后選擇添加按鈕,先來添加注冊中心,添加完注冊中心之后,這個(gè)運(yùn)維平臺會(huì)自動(dòng)從注冊中心上讀取定時(shí)任務(wù)信息:
如實(shí)填寫就行了,注意命名空間千萬別寫錯(cuò)了,寫成了其他的就讀取不到定時(shí)任務(wù)了。
接下來點(diǎn)擊連接按鈕,建立和 zk 之間的連接:
點(diǎn)擊作業(yè)維度,就可以查看作業(yè)的詳細(xì)信息,包括作業(yè)名稱、分片總數(shù)、cron 表達(dá)式等:
最后面有四個(gè)操作按鈕:
- 修改:修改作業(yè)的詳細(xì)信息,例如修改作業(yè)的 cron 表達(dá)式。
- 詳情:查看作業(yè)的詳細(xì)信息。
- 觸發(fā):觸發(fā)作業(yè)的執(zhí)行。
- 失效:相當(dāng)于暫停作業(yè)的執(zhí)行,點(diǎn)擊失效按鈕之后,會(huì)出現(xiàn)生效按鈕,點(diǎn)擊生效按鈕,作業(yè)可以生效繼續(xù)執(zhí)行。
- 終止:停止該作業(yè)。
點(diǎn)擊服務(wù)器維度,可以查看服務(wù)器信息:
4. 小結(jié)
好啦,今天就通過一個(gè)簡單的案例,和小伙伴們展示了一下 ElasticJob 的玩法,關(guān)于 ElasticJob 的其他玩法,咱們后面有空繼續(xù)聊~
本文案例下載地址:
https://github.com/lenve/javaboy-code-samples
來源:
https://mp.weixin.qq.com/s/IBvi-Feja3aQ_yw3ycjF2Q
作者:江南一點(diǎn)雨
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 整合定时任务,可以动态编辑的定时任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软王码五笔86版 for win95/
- 下一篇: 快播5.0永不升级版 孤雨定制骨头版