Spring Boot 集成 XXL-JOB 任務(wù)調(diào)度平臺

https://www.bilibili.com/video/BV1WT4y1U7Vr?spm_id_from=333.999.0.0

在開發(fā)中需要將已有的定時任務(wù)抽離出來,方便管理查看,因此選擇集成分布式任務(wù)調(diào)度平臺 XXL-JOB熔掺,本文就講解下 Spring Boot 如何集成 XXL-JOB 任務(wù)調(diào)度平臺。

XXL-JOB 簡介

XXL-JOB是一個分布式任務(wù)調(diào)度平臺叭披,其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單玩讳、輕量級趋观、易擴(kuò)展】盖荩現(xiàn)已開放源代碼并接入多家公司線上產(chǎn)品線,開箱即用皱坛。

下面我們在 Spring Boot 中集成 XXL-JOB 來完成定時任務(wù)的編寫(本文選擇的 XXL-JOB 版本為 2.2.0)编曼。

Spring Boot 集成 XXL-JOB

Spring Boot 集成 XXL-JOB 主要分為以下兩步:

配置運行調(diào)度中心(xxl-job-admin)

配置運行執(zhí)行器項目(xxl-job-executor)

配置運行調(diào)度中心

首先從源碼倉庫中下載代碼,代碼地址有兩個:

GitHub:https://github.com/xuxueli/xxl-job

Gitee:http://gitee.com/xuxueli0323/xxl-job

下載完之后剩辟,在?doc/db?目錄下有數(shù)據(jù)庫腳本?tables_xxl_job.sql掐场,執(zhí)行下腳本初始化調(diào)度數(shù)據(jù)庫?xxl_job,如下圖所示:

可以根據(jù)需要修改 xxl-job-admin 的配置文件贩猎,主要是修改數(shù)據(jù)源信息熊户,若需要用到郵件報警功能,需要配置郵箱吭服。

然后啟動項目嚷堡,正常啟動后,訪問地址為:http://localhost:8080/xxl-job-admin艇棕,默認(rèn)的賬戶為 admin蝌戒,密碼為 123456,訪問后臺管理系統(tǒng)后臺沼琉,界面如下:

這樣就表示調(diào)度中心已經(jīng)搞定了北苟,下一步就是創(chuàng)建執(zhí)行器項目。

配置運行執(zhí)行器項目

創(chuàng)建一個項目打瘪,在項目中加入 xxl-job-core 依賴友鼻,項目依賴如下所示:

<dependency>

? ? <groupId>org.springframework.boot</groupId>

? ? <artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

? ? <groupId>com.xuxueli</groupId>

? ? <artifactId>xxl-job-core</artifactId>

? ? <version>2.2.0</version>

</dependency>

加入配置

在配置文件?application.properties?中配置 xxl-job 執(zhí)行器的相關(guān)參數(shù),具體內(nèi)容如下:

### 調(diào)度中心部署跟地址 [選填]:如調(diào)度中心集群部署存在多個地址則用逗號分隔闺骚。執(zhí)行器將會使用該地址進(jìn)行"執(zhí)行器心跳注冊"和"任務(wù)結(jié)果回調(diào)"彩扔;為空則關(guān)閉自動注冊;

xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### 執(zhí)行器通訊TOKEN [選填]:非空時啟用僻爽;

xxl.job.accessToken=

### 執(zhí)行器AppName [選填]:執(zhí)行器心跳注冊分組依據(jù)借杰;為空則關(guān)閉自動注冊

xxl.job.executor.appname=xxl-job-executor

### 執(zhí)行器注冊 [選填]:優(yōu)先使用該配置作為注冊地址,為空時使用內(nèi)嵌服務(wù) ”IP:PORT“ 作為注冊地址进泼。從而更靈活的支持容器類型執(zhí)行器動態(tài)IP和動態(tài)映射端口問題。

xxl.job.executor.address=

### 執(zhí)行器IP [選填]:默認(rèn)為空表示自動獲取IP纤虽,多網(wǎng)卡時可手動設(shè)置指定IP乳绕,該IP不會綁定Host僅作為通訊時用;地址信息用于 "執(zhí)行器注冊" 和 "調(diào)度中心請求并觸發(fā)任務(wù)"逼纸;

xxl.job.executor.ip=

### 執(zhí)行器端口號 [選填]:小于等于0則自動獲妊蟠搿;默認(rèn)端口為9999杰刽,單機(jī)部署多個執(zhí)行器時菠发,注意要配置不同執(zhí)行器端口王滤;

xxl.job.executor.port=9999

### 執(zhí)行器運行日志文件存儲磁盤路徑 [選填] :需要對該路徑擁有讀寫權(quán)限;為空則使用默認(rèn)路徑滓鸠;

xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler

### 執(zhí)行器日志文件保存天數(shù) [選填] : 過期日志自動清理, 限制值大于等于3時生效; 否則, 如-1, 關(guān)閉自動清理功能雁乡;

xxl.job.executor.logretentiondays=30

其中指定了上一步部署的調(diào)度中心的地址和執(zhí)行器的相關(guān)參數(shù)。

然后在 config 包下創(chuàng)建?XxlJobConfiguration?類糜俗,會從配置文件中讀取到對應(yīng)的參數(shù)踱稍,接著申明一個?xxlJobExecutor?方法,返回的是一個?XxlJobSpringExecutor悠抹,這個方法主要是如何初始化并創(chuàng)建一個?XxlJobSpringExecutor珠月。

@Configuration

public class XxlJobConfiguration {

? ? private Logger logger = LoggerFactory.getLogger(XxlJobConfiguration.class);

? ? @Value("${xxl.job.admin.addresses}")

? ? private String adminAddresses;

? ? @Value("${xxl.job.accessToken}")

? ? private String accessToken;

? ? @Value("${xxl.job.executor.appname}")

? ? private String appname;

? ? @Value("${xxl.job.executor.address}")

? ? private String address;

? ? @Value("${xxl.job.executor.ip}")

? ? private String ip;

? ? @Value("${xxl.job.executor.port}")

? ? private int port;

? ? @Value("${xxl.job.executor.logpath}")

? ? private String logPath;

? ? @Value("${xxl.job.executor.logretentiondays}")

? ? private int logRetentionDays;

? ? @Bean

? ? public XxlJobSpringExecutor xxlJobExecutor() {

? ? ? ? logger.info(">>>>>>>>>>> xxl-job config init.");

? ? ? ? // registry jobhandler

? ? ? ? XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler());

? ? ? ? // init executor

? ? ? ? XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();

? ? ? ? xxlJobSpringExecutor.setAdminAddresses(adminAddresses);

? ? ? ? xxlJobSpringExecutor.setAppname(appname);

? ? ? ? xxlJobSpringExecutor.setAddress(address);

? ? ? ? xxlJobSpringExecutor.setIp(ip);

? ? ? ? xxlJobSpringExecutor.setPort(port);

? ? ? ? xxlJobSpringExecutor.setAccessToken(accessToken);

? ? ? ? xxlJobSpringExecutor.setLogPath(logPath);

? ? ? ? xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

? ? ? ? return xxlJobSpringExecutor;

? ? }

}

接下來就可以創(chuàng)建任務(wù)了。

編寫 JobHandler

在這里主要演示下 Bean 模式的任務(wù)楔敌,可以基于類和方法進(jìn)行開發(fā)啤挎,下面先介紹基于類的開發(fā)的任務(wù)。

BEAN模式(類形式)

首先創(chuàng)建一個類?BeanClassJobHandler卵凑,繼承?IJobHandler?實現(xiàn)?execute?方法庆聘,然后通過?XxlJobLogger.log?來打印日志。

@Component

public class BeanClassJobHandler extends IJobHandler {

? ? @Override

? ? public ReturnT<String> execute(String param) throws Exception {

? ? ? ? XxlJobLogger.log("bean class jobhandler running...");

? ? ? ? return ReturnT.SUCCESS;

? ? }

}

基于類開發(fā)的任務(wù)需要手動注冊到執(zhí)行器工廠氛谜,具體代碼如下所示:

XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler());

到此一個任務(wù)就開發(fā)完成了掏觉,下面介紹下基于方法的開發(fā)方式:

BEAN模式(方法形式)

基于方法開發(fā)的任務(wù)比較簡單,編寫一個方法值漫,并添加?@XxlJob?注解澳腹,會自動掃描該任務(wù)并注入到執(zhí)行器容器。

@Component

public class BeanMethodJobHandler {

? ? @XxlJob("beanMethodJobHandler")

? ? public ReturnT<String> beanMethodJobHandler(String param) throws Exception {

? ? ? ? XxlJobLogger.log("bean method jobhandler running...");

? ? ? ? return ReturnT.SUCCESS;

? ? }

}

至此杨何,執(zhí)行器項目就開發(fā)完成了酱塔,啟動項目,在執(zhí)行器管理頁面添加該執(zhí)行器危虱。

執(zhí)行器添加完成后羊娃,需要在任務(wù)管理界面添加我們剛才開發(fā)的兩個任務(wù),下面以 BEAN 模式方法任務(wù)為例:

點擊保存后埃跷,一個定時任務(wù)就完成了蕊玷,是不是很簡單呢?

下面啟動任務(wù)來查看下執(zhí)行結(jié)果弥雹,在這里點擊“執(zhí)行一次”垃帅,然后查詢執(zhí)行日志,結(jié)果如下圖:

可以看到我們的任務(wù)已經(jīng)成功執(zhí)行了剪勿,至此贸诚,Spring Boot 集成 XXL-JOB 任務(wù)調(diào)度平臺就完成了。

總結(jié)

Spring Boot 與 XXL-JOB 的集成是不是很簡單呢?在這里只是簡單地入門酱固,想要了解更多可以看下官方文檔:https://www.xuxueli.com/xxl-job械念。

還沒有使用過的可以通過本文快速上手,來實操起來吧运悲!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末龄减,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扇苞,更是在濱河造成了極大的恐慌欺殿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳖敷,死亡現(xiàn)場離奇詭異脖苏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)定踱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門棍潘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崖媚,你說我怎么就攤上這事亦歉。” “怎么了畅哑?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵肴楷,是天一觀的道長。 經(jīng)常有香客問我荠呐,道長赛蔫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任泥张,我火速辦了婚禮呵恢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘媚创。我一直安慰自己渗钉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布钞钙。 她就那樣靜靜地躺著鳄橘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芒炼。 梳的紋絲不亂的頭發(fā)上瘫怜,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音焕议,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛盅安,可吹牛的內(nèi)容都是我干的唤锉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼别瞭,長吁一口氣:“原來是場噩夢啊……” “哼窿祥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝙寨,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤晒衩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后墙歪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體听系,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年虹菲,在試婚紗的時候發(fā)現(xiàn)自己被綠了靠胜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡毕源,死狀恐怖浪漠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霎褐,我是刑警寧澤址愿,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站冻璃,受9級特大地震影響响谓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俱饿,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一歌粥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拍埠,春花似錦失驶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棉圈,卻和暖如春涩堤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背分瘾。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工胎围, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓白魂,卻偏偏與公主長得像汽纤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子福荸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容