XxlJob任務(wù)
SchedulerX 2.0兼容XXL-JOB任務(wù)接口,支持@XxlJob
新注解和@JobHandler
老注解方式,您不需要修改代碼,即可將XXL-JOB任務(wù)在SchedulerX 2.0平臺上進行調(diào)度。
背景信息
XXL-JOB是一個開箱即用的輕量級分布式任務(wù)調(diào)度系統(tǒng),其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴展,在開源社區(qū)廣泛流行,已在多家公司投入使用。XXL-JOB開源協(xié)議采用的是GPL,因此云廠商無法直接商業(yè)化托管該產(chǎn)品,各大中小企業(yè)需要自建,增加了學(xué)習(xí)成本、機器成本、人工運維成本。阿里巴巴商業(yè)化任務(wù)調(diào)度平臺SchedulerX 2.0兼容XXL-JOB任務(wù)接口,您不需要修改一行代碼,即可將XXL-JOB任務(wù)在SchedulerX 2.0平臺上托管。
采用托管的XXL-JOB有以下優(yōu)勢:
免運維、低成本
自建XXL-JOB最少需要2個服務(wù)器和1個數(shù)據(jù)庫支撐,而使用托管的XXL-JOB可以省去這些機器成本和人力運維成本。
海量任務(wù)、精準(zhǔn)調(diào)度
開源XXL-JOB基于競爭數(shù)據(jù)庫鎖保證只有一個節(jié)點執(zhí)行任務(wù),對于數(shù)據(jù)庫有壓力。據(jù)統(tǒng)計,當(dāng)任務(wù)超過1萬,都是分鐘級別的任務(wù)時,就會有比較明顯的調(diào)度延時,如果是秒級別任務(wù),延時就更加明顯。SchedulerX 2.0采用分布式架構(gòu),不同的server調(diào)度不同的任務(wù),且無鎖競爭,真正實現(xiàn)可以水平擴展,可以支持百萬級別任務(wù)調(diào)度。SchedulerX 2.0針對秒級別任務(wù)低延時的特性,采用了專門的架構(gòu),占用資源極低,可以作為實時業(yè)務(wù)的秒級別調(diào)度場景。另外,SchedulerX 2.0還支持一次性任務(wù),可以指定未來某個時刻執(zhí)行一次任務(wù),執(zhí)行完任務(wù)自動銷毀,可以作為定時通知、訂單定時關(guān)閉等場景。
高級特性
工作流:通過可視化的工作流進行任務(wù)編排。
限流:可搶占的任務(wù)優(yōu)先級隊列。
資源隔離:支持命名空間和應(yīng)用級別的資源隔離,支持多租戶權(quán)限管理。
高可用
SchedulerX 2.0采用高可用架構(gòu),任務(wù)多備份機制,經(jīng)歷過阿里集團多年雙十一、容災(zāi)演練等場景的考驗,可以做到整個集群掛掉任意2個節(jié)點或者任意一個機房斷電,任務(wù)調(diào)度都不會受到影響。
商業(yè)化報警運維
SchedulerX 2.0除了兼容XXL-JOB的郵件報警和基本運維操作,還提供了商業(yè)化報警和運維功能:
報警:通過釘釘群、短信、電話等發(fā)送通知。
運維:支持原地重跑、重刷數(shù)據(jù)、標(biāo)記成功、查看堆棧、停止任務(wù)等操作。
與開源XXL-JOB的區(qū)別
與開源XXL-JOB的區(qū)別入如下表所示。
功能 | 開源XXL-JOB | SchedulerX為底座的XXL-JOB任務(wù) |
Java任務(wù) | ||
Go任務(wù) | ||
腳本任務(wù) | ||
HTTP任務(wù) | ||
單機 | ||
分片廣播 | ||
MapReduce模型 | ||
路由策略 | 第一個、最后一個、輪詢、隨機等 | 輪詢 |
定時 | cron | cron、fixed_rate、fixed_delay、one_time |
工作流 | ||
運維操作 | 運行一次、停止運行 | 運行一次、停止運行、原地重跑、重刷數(shù)據(jù)、標(biāo)記成功 |
日志查詢 | 日志存在executor本地,機器掛了日志丟失 | 日志存儲在阿里云日志服務(wù),保留最近2周,支持搜索 |
可觀測 | 歷史記錄、運行大盤 | 歷史記錄、運行大盤、操作記錄、查看堆棧、鏈路追蹤 |
報警監(jiān)控 | 郵件 | 郵件、釘釘、飛書、企業(yè)微信、自定義WebHook、短信、電話 |
高可用及容災(zāi) | 需要自己維護數(shù)據(jù)庫和Server的容災(zāi) | 默認(rèn)支持同城多機房容災(zāi) |
用戶權(quán)限 | 用戶隔離,通過賬號密碼登錄 | 支持單點登錄、主子賬號、角色、RAM精細(xì)化權(quán)限管理 |
優(yōu)雅下線 | ||
全鏈路灰度 | ||
限流 |
接入配置
應(yīng)用的pom.xml文件做如下變更:將
com.xuxueli:XXL-JOB-core
的依賴去除,增加SchedulerX客戶端的依賴和com.aliyun:schedulerx2-plugin-xxljob
插件。因為XXL-JOB在2.3.x版本重構(gòu)了接口,請根據(jù)XXL-JOB的版本選擇不同的接入方式,以
schedulerx2-spring-boot-starter
應(yīng)用為例,配置內(nèi)容如下:2.3.x版本接入,請參考Demo。
schedulerx2.version
使用客戶端最新版本,例如<version>1.11.5</version>
。更多信息,請參見客戶端發(fā)布記錄。<!-- 注釋xxl-job-core --> <!-- <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${project.parent.version}</version> </dependency> --> <!-- 添加schedulerx依賴 --> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-spring-boot-starter</artifactId> <version>${schedulerx2.version}</version> </dependency> <!-- 新增schedulerx2-plugin-xxljob --> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-plugin-xxljob</artifactId> <version>2.3.5</version> </dependency>
2.2.x以下版本接入,請參考Demo。
schedulerx2.version
使用客戶端的最新版本,例如<version>1.11.5</version>
。更多信息,請參見客戶端發(fā)布記錄。<!-- 注釋xxl-job-core --> <!-- <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${project.parent.version}</version> </dependency> --> <!-- 添加schedulerx依賴 --> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-spring-boot-starter</artifactId> <version>${schedulerx2.version}</version> </dependency> <!-- 新增schedulerx2-plugin-xxljob --> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-plugin-xxljob</artifactId> <version>2.2.4</version> </dependency>
agent.properties文件添加如下配置,具體操作,請參見Agent接入(腳本或HTTP任務(wù))。
spring.schedulerx2.endpoint=192.xx.xx.xx spring.schedulerx2.namespace=20e90ffc**** spring.schedulerx2.groupId=679xxx spring.schedulerx2.appKey=71BCC0Exxx
使用Xxljob方法創(chuàng)建任務(wù)
參考開源XXL-JOB-executor-sample-springboot
工程,創(chuàng)建方法任務(wù),示例代碼如下:
/**
* 簡單任務(wù)示例(Bean模式)
*/
@XxlJob("demoJobHandler")
public ReturnT<String> demoJobHandler(String param) throws Exception {
System.out.println("XXL-JOB, " + param);
return ReturnT.SUCCESS;
}
- 登錄分布式任務(wù)調(diào)度平臺。
在左側(cè)導(dǎo)航欄單擊任務(wù)管理。
在應(yīng)用列表頁面頂部菜單欄選擇地域,在頁面中選擇所屬命名空間,然后單擊創(chuàng)建任務(wù)。關(guān)于參數(shù)配置,請參見創(chuàng)建調(diào)度任務(wù)。
在任務(wù)管理頁面,單擊目標(biāo)任務(wù)操作列下的運行一次。
在任務(wù)管理頁面,單擊目標(biāo)任務(wù)操作列下的更多>歷史記錄,可以查看任務(wù)實例記錄。
使用JobHandler方法創(chuàng)建任務(wù)
示例代碼如下:
@JobHandler(value="HelloJobHandler")
@Componentpublic class HelloJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
System.out.println("HelloJobHandler: " + param);
return SUCCESS;
}
}
- 登錄分布式任務(wù)調(diào)度平臺。
在左側(cè)導(dǎo)航欄單擊任務(wù)管理。
在應(yīng)用列表頁面頂部菜單欄選擇地域,在頁面中選擇所屬命名空間,然后單擊創(chuàng)建任務(wù)。參數(shù)配置,請參見創(chuàng)建調(diào)度任務(wù)。
在任務(wù)管理頁面,單擊目標(biāo)任務(wù)操作列下的運行一次。
在任務(wù)管理頁面,單擊目標(biāo)任務(wù)操作列下的更多>歷史記錄,可以查看任務(wù)實例記錄。
使用分片廣播的方式創(chuàng)建任務(wù)
以XxlJob方法注解為例,示例代碼如下:
/**
* 分片廣播任務(wù)
*/
@XxlJob("shardingJobHandler")
public ReturnT<String> shardingJobHandler(String param) throws Exception {
// 分片參數(shù)
int shardIndex = XxlJobContext.getXxlJobContext().getShardIndex();
int shardTotal = XxlJobContext.getXxlJobContext().getShardTotal();
XxlJobLogger.log("分片參數(shù):當(dāng)前分片序號 = {}, 總分片數(shù) = {}", shardIndex, shardTotal);
System.out.println("分片參數(shù):當(dāng)前分片序號 ="+ shardIndex + ", 總分片數(shù) = " + shardTotal);
// 業(yè)務(wù)邏輯
for (int i = 0; i < shardTotal; i++) {
if (i == shardIndex) {
System.out.println("第 " + i + " 片, 命中分片開始處理");
XxlJobLogger.log("第 {} 片, 命中分片開始處理", i);
} else {
XxlJobLogger.log("第 {} 片, 忽略", i);
}
}
return ReturnT.SUCCESS;
}
- 登錄分布式任務(wù)調(diào)度平臺。
在左側(cè)導(dǎo)航欄單擊任務(wù)管理。
在應(yīng)用列表頁面頂部菜單欄選擇地域,在頁面中選擇所屬命名空間,然后單擊創(chuàng)建任務(wù)。關(guān)于參數(shù)配置,請參見創(chuàng)建調(diào)度任務(wù)。
在任務(wù)管理頁面,單擊目標(biāo)任務(wù)操作列下的運行一次。
在任務(wù)管理頁面,單擊目標(biāo)任務(wù)操作列下的更多>歷史記錄,可以查看任務(wù)實例記錄。
XXL-JOB任務(wù)批量遷移
下載導(dǎo)出工具。
解壓工具包,在
application.properties
文件中進行導(dǎo)出配置。配置參數(shù)如下:
### xxl-job, datasource datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai datasource.username=root datasource.password=123456 datasource.driver-class-name=com.mysql.cj.jdbc.Driver ### 配置對應(yīng)要導(dǎo)出的app-name(該步驟可選,不設(shè)置的情況下導(dǎo)出所有任務(wù)分組) #xxl-job.app-name=xxl-job-executor-sample
執(zhí)行
./start.sh
命令運行導(dǎo)出操作。執(zhí)行完成后,在當(dāng)前目錄下獲得
xxljob_*******.json
的任務(wù)配置文件(僅包含Bean模式的任務(wù)配置信息)。
登錄SchedulerX 2.0控制臺。
在左側(cè)導(dǎo)航欄單擊任務(wù)管理。
在任務(wù)管理頁面上方單擊導(dǎo)入任務(wù)。
選擇待導(dǎo)入的任務(wù)配置文件后單擊導(dǎo)入,即可完成XXL-JOB任務(wù)配置信息和SchedulerX任務(wù)配置信息的同步。