目錄
- 1、xxl-job介紹
- 1.1 xxl-job的原理
- 1.1.1 執行器的注冊和發現
- 1.1.2 調度中心調用執行器
- 1.2 quartz和xxl-job對比
- 2、快速入門
- 2.1 下載并啟動
- 2.2 在調度中心新增定時任務
- 2.3 任務運行模式(BEAN、GLUE)
- 2.4 xxl-job的總結
- 3、后端專屬技術群
1、xxl-job介紹
? xxl-job是一個分布式的任務調度平臺,其核心設計目標是:學習簡單、開發迅速、輕量級、易擴展,現在已經開放源代碼并接入多家公司的線上產品線,開箱即用。xxl是xxl-job的開發者大眾點評的許雪里名稱的拼音開頭。
? xxl-job框架主要用于處理分布式的定時任務,其主要由調度中心和執行器組成。
- 調度模塊(調度中心):
負責管理調度信息,按照調度配置發出調度請求,自身不承擔業務代碼。調度系統與任務解耦,提高了系統可用性和穩定性,同時調度系統性能不再受限于任務模塊;
支持可視化、簡單且動態的管理調度信息,包括任務新建,更新,刪除,GLUE開發和任務報警等,所有上述操作都會實時生效,同時支持監控調度結果以及執行日志,支持執行器Failover。 - 執行模塊(執行器):
負責接收調度請求并執行任務邏輯。任務模塊專注于任務的執行等操作,開發和維護更加簡單和高效;
接收“調度中心”的執行請求、終止請求和日志請求等。
總結:
? 調度中心:統一管理任務調度平臺上的調度任務,負責觸發調度執行,并且提供任務管理平臺。
? 執行器:接收調度中心的調度并且執行,可以直接執行也可以集成到項目中。
每一個xxl-job微服務 = 獨立的人(執行器)
每一個Handler = 餐桌上的食物
"可視化界面可以決定哪個人(執行器)吃或者不吃某個食物(定時任務)"
? 調度中心和執行器兩個模塊分開部署,相互分離,兩者之間通過RPC進行通信,其中調度中心主要是提供一個平臺,管理調度信息,發送調度請求,自己不承擔業務代碼,而執行器接受調度中心的調度執行業務邏輯。
1.1 xxl-job的原理
1.1.1 執行器的注冊和發現
執行器的注冊和發現主要是關系兩張表:
xxl_job_registry:執行器的實例表,保存實例信息和心跳信息,xxl_job_group:每個服務注冊的實例列表。
執行器啟動線程每隔30秒向注冊表xxl_job_registry請求一次,更新執行器的心跳信息,調度中心啟動線程每隔30秒檢測一次xxl_job_registry,將超過90秒還沒有收到心跳的實例信息從xxl_job_registry刪除,并更新xxl_job_group服務的實例列表信息。
1.1.2 調度中心調用執行器
1、調度中心的操作:
調度中心通過循環不停的:
2、執行器的操作:
- 執行器接收到調度中心的調度信息,將調度信息放到對應的任務的等待隊列中
- 執行器的任務處理線程從任務隊列中取出調度信息,執行業務邏輯,將結果放入一個公共的等待隊列中(每個任務都有一個單獨的處理線程和等待隊列,任務信息放入該隊列中)
- 執行器有一個專門的回調線程定時批量從結果隊列中取出任務結果,并且回調告知調度中心
1.2 quartz和xxl-job對比
- quartz采用api的方式調用任務,不方便,但是xxl-job使用的是管理界面。
- quartz比xxl-job代碼侵入更強
- quartz調度邏輯和QuartzJobBean耦合在一個項目中,當任務增多,邏輯復雜的時候,性能會受到影響
- quartz底層以搶占式獲取db鎖并且由搶占成功的節點運行,導致節點負載懸殊非常大;xxl-job通過執行器實現協同分配式運行任務,各個節點比較均衡。
2、快速入門
2.1 下載并啟動
首先從GitHub上面將項目clone下來,如果網絡問題導致速度慢也可以從Gitee上面拉取
GitHub地址:https://github.com/xuxueli/xxl-jobGitee地址:https://gitee.com/xuxueli0323/xxl-job
1、源碼下載解壓,用idea打開,結果如圖:
doc:文檔資料,包括"調度數據庫"建表腳本
xxl-job-core:公共 Jar 依賴
xxl-job-admin:調度中心,項目源碼,spring boot 項目,可以直接啟動
xxl-job-executor-samples:執行器,sample 示例項目,其中的 spring boot 工程,可以直接啟動。可以在該項目上進行開發,也可以將現有項目改造生成執行器項目。
2、初始化數據庫,運行doc/db/tables_xxl_job.sql中的sql生成數據庫和表,如圖:
數據庫中表介紹:- xxl_job_group:執行器信息表,維護任務執行器信息;- xxl_job_info:調度擴展信息表: 用于保存XXL-JOB調度任務的擴展信息,如任務分組、任務名、機器地址、執行器、執行入參和報警郵件等等;- xxl_job_lock:任務調度鎖表;- xxl_job_log:調度日志表: 用于保存XXL-JOB任務調度的歷史信息,如調度結果、執行結果、調度入參、調度機器和執行器等等;- xxl_job_log_report:調度日志報表:用戶存儲XXL-JOB任務調度日志的報表,調度中心報表功能頁面會用到;- xxl_job_logglue:任務GLUE日志:用于保存GLUE更新歷史,用于支持GLUE的版本回溯功能;- xxl_job_registry:執行器注冊表,維護在線的執行器和調度中心機器地址信息;- xxl_job_user:系統用戶表;
3 、打開xxl-job-admin模塊,在application.properties中進行后臺的配置,修改數據庫信息
部署調度中心
調度中心訪問地址:http://localhost:8080/xxl-job-admin ,默認登錄賬號 “admin/123456”, 登錄后運行界面如下圖所示。
4、執行器配置及部署
創建一個新的定時任務,定位到jobhandler下,新增定時任務
package com.xxl.job.executor.service.jobhandler;import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;import static com.xxl.job.core.biz.model.ReturnT.SUCCESS;/*** @author zh* @description 編寫自己的定時任務handler* @date 2023/12/8 14:55*/@Component
public class MyJobHandler {/*** 簡單任務示例【bean模式】* @param param* @return*/@XxlJob(value = "myJobHandler", init = "", destroy = "")public ReturnT<String> demoJobHandler(String param) throws InterruptedException {//模擬業務執行System.out.println("hello xxl-job..,");//返回執行結果return SUCCESS;}
}
2.2 在調度中心新增定時任務
1、選中右側任務管理 - 新增
2、啟動XxlJobExecutorApplication執行器
3、在調度中心,啟動定時任務
4、查看結果
2.3 任務運行模式(BEAN、GLUE)
運行模式分為兩種,一種是BEAN,一種是GLUE
BEAN模式:這個是在項目中寫 Java 類,然后在 JobHandler 里填上 @XxlJob 里面的名字,是在執行器端編寫的
GLUE模式:支持Java、Shell、Python、PHP、Nodejs、PowerShell,這個時候代碼是直接維護在調度中心這邊的
2.4 xxl-job的總結
? xxl-job是一個中心式分布式的調度平臺,調度中心和執行器解耦,執行器和業務代碼耦合,代碼的侵入性少,學習簡單、開發簡單、輕量級。
3、后端專屬技術群