分布式任務(wù)調(diào)度XXL-Job,賊好用,體驗一把
背景
為了能夠更加靈活的控制定時任務(wù),最近在項目中開始推行定時任務(wù)調(diào)度系統(tǒng),跟不少大廠朋友交流之后,發(fā)現(xiàn)XXL-Job市場還是挺廣的,功能強(qiáng)大,定為首選。
再加上XXL-Job是基于Spring Boot的開源項目,二次開發(fā)非常容易,所以就選定了XXL-Job。這篇文章就帶大家領(lǐng)略一下XXL-Job的魅力,可以不用,但不可不知道。
XXL-Job簡介
訪問官方網(wǎng)站會看到XXL-Job各類特性介紹,這里總結(jié)一下就是:學(xué)習(xí)簡單、輕量級、易擴(kuò)展、動態(tài)生效、調(diào)度中心HA、執(zhí)行器HA、彈性擴(kuò)容縮容、路由策略、故障轉(zhuǎn)移、阻塞處理策略、任務(wù)超時控制、任務(wù)失敗重試、任務(wù)失敗告警、分片廣播任務(wù)、動態(tài)分片、事件觸發(fā)等很多特性。
上面介紹了優(yōu)點,而個人在實踐和使用的過程中發(fā)現(xiàn)代碼的規(guī)范性、代碼質(zhì)量等都有待提高和規(guī)范。具有二次開發(fā)能力的我們,可以對配置文件環(huán)境隔離、日志配置等進(jìn)行定制化處理。提升空間還是有的。
下面就來具體實踐、體驗一下。
源碼下載
可通過GitHub或Gitee上下載源碼:
GitHub地址:http://github.com/xuxueli/xxl-job
Gitee地址:https://gitee.com/xuxueli0323/xxl-job
這里通過Gitee下載:
git clone git@gitee.com:xuxueli0323/xxl-job.git
下載完成,用IDE打開項目結(jié)構(gòu):
xxl-job
直接拉取代碼是主干代碼,可看到版本是2.3.1-SNAPSHOT,原則上還是建議使用穩(wěn)定版本。此時可以通過git命令從主干切換到穩(wěn)定版本2.3.0或通過IDE提供的版本工具進(jìn)行切換。
這里通過git命令切換到遠(yuǎn)程分支:
git checkout -b 2.3.0 origin/2.3.0
項目結(jié)構(gòu)項目源碼結(jié)構(gòu)如下:
- xxl-job-admin:調(diào)度中心
- xxl-job-core:公共依賴
- xxl-job-executor-samples:執(zhí)行器Sample示例;
- xxl-job-executor-sample-springboot:Springboot版本,通過Springboot管理執(zhí)行器,推薦這種方式;
- xxl-job-executor-sample-frameless:無框架版本;
部署時,調(diào)度中心單獨部署,samples中代碼可集成到項目中進(jìn)行使用。
初始化表結(jié)構(gòu)
找到項目源碼中doc/db目錄下的tables_xxl_job.sql,用來初始化數(shù)據(jù)庫表結(jié)構(gòu)。
會創(chuàng)建一個名為xxl_job的數(shù)據(jù)庫,并且包含了8張以xxl_job開頭的表
xxl_job表
修改項目配置
打開xxl-job-admin項目中的application.properties文件進(jìn)行后臺的配置,比如配置數(shù)據(jù)庫連接、配置發(fā)送郵件地址等信息。
此時你應(yīng)該也想到,需要把整個項目納入到自己的代碼倉庫,進(jìn)行配置修改、環(huán)境隔離以及進(jìn)行部分二開工作。
筆者進(jìn)行了簡單的改造,將原本的application.properties配置文件進(jìn)行了拆分:
- application.properties
- application-dev.properties
- application-prod.properties
- application-test.properties
在application.properties中指定不同環(huán)境采用不同的配置文件信息,方便自動化發(fā)布。
spring.profiles.active=dev
打包發(fā)布
此時可以直接在IDE中執(zhí)行Spring Boot的main方法來啟動項目,看看效果,也可以打成jar包進(jìn)行發(fā)布。使用過Spring Boot的朋友們應(yīng)該都知道如何去操作。
這里直接啟動,會發(fā)現(xiàn)日志文件找不到,無法啟動程序。原因在logback.xml中的配置:
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-admin.log"/>
最簡單的操作是將該路徑改為本地存在的目錄。但筆者認(rèn)為將日志路徑寫死在xml文件中并不優(yōu)化,進(jìn)一步二開將其提取到配置文件中。
<!-- <property name="log.path" value="/data/applogs/xxl-job/xxl-job-admin.log"/>-->
<springProperty scope="context" name="log.path" source="log.path"/>
不同環(huán)境的配置文件添加路徑配置:
log.path=/Users/zzs/temp/xxl-job-admin.log
修改之后,啟動完畢。
訪問:http://localhost:8888/xxl-job-admin
這里筆者將端口進(jìn)行了修改。默認(rèn)的用戶名為:admin,密碼為:123456。
登錄成功,主界面顯示如下:
xxl-job-admin
關(guān)于admin的部署已經(jīng)完成,接下來需要先編寫執(zhí)行器的代碼,然后再通過admin進(jìn)行調(diào)用。
執(zhí)行器編寫及部署
執(zhí)行器代碼可直接參考xxl-job-executor-sample-springboot中的實例進(jìn)行編寫。
本質(zhì)上就是Spring Boot項目中引入了xxl-job的依賴:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${project.parent.version}</version>
</dependency>
然后通過配置類對XxlJobSpringExecutor進(jìn)行初始化,剩下的就是基于@XxlJob來定義定時任務(wù)的JobHandler。
如下便新定義了一個JobHandler:
@Component
public class MyXxlJob {
@XxlJob("helloXxlJobHandler")
public void helloXxlJobHandler() {
String jobParam = XxlJobHelper.getJobParam();
System.out.println("jobParam=" + jobParam);
System.out.println("Hello XXL-Job");
}
}
在啟動之前,先對xxl-job-executor-sample-springboot的配置文件進(jìn)行修改,除了前面提到的日志文件,還涉及到xxl.job.admin.addresses,修改為admin的地址:
xxl.job.admin.addresses=http://localhost:8888/xxl-job-admin
執(zhí)行main方法,啟動程序。此時,再回到admin管理頁面的任務(wù)管理菜單:
任務(wù)管理
點擊右上角新增任務(wù):
新增任務(wù)
按照參數(shù)說明配置完成,結(jié)果如下:
執(zhí)行
執(zhí)行完成 ,可在調(diào)度日志中查看到執(zhí)行的歷史。
調(diào)度日志
看看控制臺:
jobParam=hello,xxl-job
Hello XXL-Job
程序被成功調(diào)用,同時也獲取到了admin傳遞的參數(shù)。
此后,該定時任務(wù)的執(zhí)行頻次、執(zhí)行規(guī)則,甚至執(zhí)行時傳遞的參數(shù)都可以通過admin管理平臺進(jìn)行操作。
小結(jié)
經(jīng)過本文體驗了一把XXL-Job,感覺怎么樣?比在項目中寫死定時任務(wù)或在數(shù)據(jù)庫中配置靈活多了,有管理頁面,有執(zhí)行歷史,可以靈活配置,甚至可以傳遞調(diào)用參數(shù)等等功能都是非常實用的。建議你也嘗試一把。