日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot 整合定时任务,可以动态编辑的定时任务

發布時間:2024/8/1 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot 整合定时任务,可以动态编辑的定时任务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先我們來看一個現成的框架: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

運維平臺使用步驟:

  • 克隆項目下來: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

    作者:江南一點雨

    總結

    以上是生活随笔為你收集整理的Spring Boot 整合定时任务,可以动态编辑的定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。