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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【XXL-JOB】XXL-JOB的搭建和使用

發布時間:2024/1/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【XXL-JOB】XXL-JOB的搭建和使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【XXL-JOB】XXL-JOB的搭建和使用

文章目錄

  • 【XXL-JOB】XXL-JOB的搭建和使用
    • 1. 任務調度
      • 1.1 實現任務調度
        • 1.1.1 多線程實現
        • 1.1.2 Timer實現
        • 1.1.3 ScheduledExecutor實現
    • 2. 分布式任務調度
      • 2.1 采用分布式的原因
    • 3. XXL-JOB
      • 3.1 XXL-JOB介紹
      • 3.2 執行流程
    • 4. 搭建XXL-JOB
      • 4.1 創建數據庫
      • 4.2 導入依賴,配置執行器
      • 4.3 調度中心配置
      • 4.4 執行任務
      • 4.5 查看日志
      • 4.6 停止任務

1. 任務調度

任務調度:顧名思義,就是對任務的調度,它是指系統為了完成特定業務,基于給定時間點,給定時間間隔或者給定執行次數自動執行任務

那么,我們如何去高效的處理一批任務呢?這里有兩種方案:

  • 多線程(多線程可以充分利用單機的資源)
  • 分布式+多線程(充分利用多臺計算機資源,每臺計算機使用多線程)
  • 方案2的可擴展性更強,這是一種分布式任務調度的處理方案。

    那么什么又是分布式任務調度呢?

    給定多個場景:

    • 某電商系統需要在每天上午10點,下午3點,晚上8點發放一批優惠券。
    • 某財務系統需要在每天上午10點前結算前一天的賬單數據,統計匯總。
    • 某電商平臺每天凌晨3點,要對訂單中的無效訂單進行清理。
    • 12306網站會根據車次不同,設置幾個時間點分批次放票。
    • 。。。。。。

    以上這些問題,就是任務調度需要解決的問題。


    1.1 實現任務調度

    1.1.1 多線程實現

    我們可以開啟一個線程,每隔一段時間就去執行一個任務。

    如下代碼所示:

    這個程序的功能是每隔1s,執行一次。

    public static void main(String[] args) { //任務執行間隔時間final long timeInterval = 1000;Runnable runnable = new Runnable() {public void run() {while (true) {//TODO:somethingtry {Thread.sleep(timeInterval);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread thread = new Thread(runnable);thread.start(); }

    Jdk也為我們提供了相關支持,如Timer、ScheduledExecutor。


    1.1.2 Timer實現

    如下代碼的功能是1s之后開始調度,并且每隔2s執行一次。

    public static void main(String[] args){ Timer timer = new Timer(); timer.schedule(new TimerTask(){@Override public void run() { //TODO:something} }, 1000, 2000); //1秒后開始調度,每2秒執行一次 }

    Timer 的優點在于簡單易用,每個Timer對應一個線程,因此可以同時啟動多個Timer并行執行多個任務,同一個Timer中的任務是串行執行。


    1.1.3 ScheduledExecutor實現

    public static void main(String [] agrs){ScheduledExecutorService service = Executors.newScheduledThreadPool(10);service.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {//TODO:somethingSystem.out.println("todo something");}}, 1,2, TimeUnit.SECONDS); }

    Java 5 推出了基于線程池設計的 ScheduledExecutor,其設計思想是,每一個被調度的任務都會由線程池中一個線程去執行,因此任務是并發執行的,相互之間不會受到干擾。


    2. 分布式任務調度

    通常任務調度的程序是集成在應用中的,比如:優惠卷服務中包括了定時發放優惠卷的的調度程序,結算服務中包括了定期生成報表的任務調度程序,由于采用分布式架構,一個服務往往會部署多個冗余實例來運行我們的業務,在這種分布式系統環境下運行任務調度,我們稱之為分布式任務調度

    如下圖:


    2.1 采用分布式的原因

    不管是任務調度程序集成在應用程序中,還是單獨構建的任務調度系統,如果采用分布式調度任務的方式就相當于將任務調度程序分布式構建,這樣就可以具有分布式系統的特點,并且提高任務的調度處理能力。

    所以分布式調度要實現的目標是:

  • 并行任務調度: 并行任務調度實現靠多線程,如果有大量任務需要調度,此時光靠多線程就會有瓶頸了,因為一臺計算機CPU的處理能力是有限的。如果將任務調度程序分布式部署,每個結點還可以部署為集群,這樣就可以讓多臺計算機共同去完成任務調度,我們可以將任務分割為若干個分片,由不同的實例并行執行,來提高任務調度的處理效率。
  • 高可用:若某一個實例宕機,不影響其他實例來執行任務。
  • 彈性擴容:當集群中增加實例就可以提高并行任務的處理效率。
  • 任務管理與監測:對系統中存在的所有定時任務進行統一的管理及監測。讓開發人員及運維人員能夠時刻了解任務執行情況,從而做出快速的應急處理響應。
  • 避免任務重復執行:當任務調度以集群方式部署,同一個任務調度可能會執行多次,比如在上面提到的電商系統中到點發優惠券的例子,就會發放多次優惠券,對公司造成很多損失,所以我們需要控制相同的任務在多個運行實例上只執行一次。
  • 注:第五點尤為重要。


    3. XXL-JOB

    3.1 XXL-JOB介紹

    XXL-JOB是一個輕量級分布式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼并接入多家公司線上產品線,開箱即用。

    官網:XXL-JOB

    文檔:XXL-JOB文檔

    XXL-JOB主要有調度中心執行器任務

    • 調度中心:
      • 負責管理調度信息,按照調度配置發出調度請求,自身不承擔業務代碼
      • 主要職責為執行器管理、任務管理、監控運維、日志管理等
    • 執行器:
      • 負責接收調度請求并執行任務邏輯
      • 主要職責是注冊服務、任務執行服務(接收到任務后會放入線程池中的任務隊列)、執行結果上報、日志服務等
    • 任務:
      • 負責執行具體的業務處理。

    3.2 執行流程

    調度中心與執行器之間的工作流程如下:

    執行流程:

  • 任務執行器根據配置的調度中心的地址,自動注冊到調度中心
  • 達到任務觸發條件,調度中心下發任務
  • 執行器基于線程池執行任務,并把執行結果放入內存隊列中,把執行日志寫入日志文件中
  • 執行器消費內存隊列中的執行結果,主動上報給調度中心。
  • 當用戶在調度中心查看任務日志,調度中心請求任務執行器,任務執行器讀取任務日志文件并返回日志詳情。

  • 4. 搭建XXL-JOB

    首先下載XXL-JOB:

    • GitHub:https://github.com/xuxueli/xxl-job
    • Gitee:https://gitee.com/xuxueli0323/xxl-job

    下載后使用idea打開項目:

    項目模塊有三個:

    • xxl-job-admin:調度中心
    • xxl-job-core:項目的核心包
    • xxl-job-executor-samples:執行器示例代碼(可參考)
      • xxl-job-executor-sample-springboot:Springboot版本,通過Springboot管理執行器,推薦這種方式;
      • xxl-job-executor-sample-frameless:無框架版本;
    • doc:文檔資料,包含數據庫腳本

    4.1 創建數據庫

    創建數據庫,并導入doc文檔中的數據庫腳本:

    導入成功之后,運行xxl-job-admin項目,登陸賬號為:admin,密碼為:123456


    4.2 導入依賴,配置執行器

    1)導入依賴

    在我們需要執行任務調度的模塊中導入如下依賴:

    <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId> </dependency>

    2)yml配置

    在配置文件(可以在nacos或本地文件)中配置:

    xxl:job:admin: addresses: http://localhost:8080/xxl-job-adminexecutor:appname: media-process-service #執行器名字(很重要,在調度中心要用到)address: ip: port: 9999 #執行器端口號logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 30accessToken: default_token

    3)配置xxl-job的執行器

    將示例工程下的配置類拷貝到自己的service工程下:


    4.3 調度中心配置

    進入調度中心添加執行器:

    點擊新增,彈出如下對話框:

    圖中的 AppName 填我們上面配置文件中配置的執行器名字,名稱隨意。其他的可以不填。

    填寫完畢之后點擊保存。

    重新運行我們的項目,如果控制臺中輸出如下內容說明執行器在調度中心注冊成功:

    同時,我們可以在調度中心中查看到執行器的地址:


    4.4 執行任務

    我們復制示例工程中的 SampleXxjJob 到我們的項目中:

    我們刪除部分代碼,只留如下代碼(任務代碼):

    @Component public class SampleXxlJob {private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);/*** 1、簡單任務示例(Bean模式)*/@XxlJob("demoJobHandler")//記住這個名字,后面要使用public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");for (int i = 0; i < 5; i++) {XxlJobHelper.log("beat at:" + i);TimeUnit.SECONDS.sleep(2);}// default success} }

    1)在調度中心添加任務

    進入調度中心,在任務管理中新增任務:

    點擊新增,填寫任務信息:

    注意紅色標記處:

    調度類型選擇Cron,并配置Cron表達式設置定時策略。

    Cron表達式是一個字符串,通過它可以定義調度策略,格式如下:

    {秒數} {分鐘} {小時} {日期} {月份} {星期} {年份(可為空)}

    xxl-job提供圖形界面去配置:

    運行模式有BEAN和GLUE,bean模式較常用就是在項目工程中編寫執行器的任務代碼,GLUE是將任務代碼編寫在調度中心。

    JobHandler任務方法名填寫@XxlJob注解中的名稱。

    添加成功后,啟動任務。


    4.5 查看日志

    點擊左側菜單欄“調度日志”即可查看任務執行情況:

    任務執行了一段之間要注意清理日志,點擊右上角的“清理”按鈕即可。


    4.6 停止任務

    如果想要停止任務,需要在調度中心中操作:

    總結

    以上是生活随笔為你收集整理的【XXL-JOB】XXL-JOB的搭建和使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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