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