XXL-JOB是一個輕量級分佈式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼並接入多家公司線上產品線,開箱即用。php
於2015年中,我在github上建立XXL-JOB項目倉庫並提交第一個commit,隨之進行系統結構設計,UI選型,交互設計……html
於2015-11月,XXL-JOB終於RELEASE了第一個大版本V1.0, 隨後我將之發佈到OSCHINA,XXL-JOB在OSCHINA上得到了@紅薯的熱門推薦,同期分別達到了OSCHINA的「熱門動彈」排行第一和git.oschina的開源軟件月熱度排行第一,在此特別感謝紅薯,感謝你們的關注和支持。java
於2015-12月,我將XXL-JOB發表到我司內部知識庫,而且獲得內部同事承認。node
於2016-01月,我司展開XXL-JOB的內部接入和定製工做,在此感謝袁某和尹某兩位同事的貢獻,同時也感謝內部其餘給與關注與支持的同事。python
於2017-05-13,在上海舉辦的 "第62期開源中國源創會" 的 "放碼過來" 環節,我登臺對XXL-JOB作了演講,臺下五百位在場觀衆反響熱烈(圖文回顧 )。mysql
於2017-10-22,又拍雲 Open Talk 聯合 Spring Cloud 中國社區舉辦的 "進擊的微服務實戰派上海站",我登臺對XXL-JOB作了演講,現場觀衆反響熱烈並在會後與XXL-JOB用戶熱烈討論交流。nginx
於2017-12-11,XXL-JOB有幸參會《InfoQ ArchSummit全球架構師峯會》,並被拍拍貸架構總監"楊波老師"在專題 "微服務原理、基礎架構和開源實踐" 中現場介紹。git
於2017-12-18,XXL-JOB參與"2017年度最受歡迎中國開源軟件"評比,在當時已錄入的約九千個國產開源項目中角逐,最終進入了前30強。github
於2018-01-15,XXL-JOB參與"2017碼雲最火開源項目"評比,在當時已錄入的約六千五百個碼雲項目中角逐,最終進去了前20強。ajax
於2018-04-14,iTechPlus在上海舉辦的 "2018互聯網開發者大會",我登臺對XXL-JOB作了演講,現場觀衆反響熱烈並在會後與XXL-JOB用戶熱烈討論交流。
於2018-05-27,在上海舉辦的 "第75期開源中國源創會" 的 "架構" 主題專場,我登臺進行「基礎架構與中間件圖譜」主題演講,臺下上千位在場觀衆反響熱烈(圖文回顧 )。
我司大衆點評目前已接入XXL-JOB,內部別名《Ferrari》(Ferrari基於XXL-JOB的V1.1版本定製而成,新接入應用推薦升級最新版本)。 據最新統計, 自2016-01-21接入至2017-12-01期間,該系統已調度約100萬次,表現優異。新接入應用推薦使用最新版本,由於通過數十個版本的更新,系統的任務模型、UI交互模型以及底層調度通信模型都有了較大的優化和提高,核心功能更加穩定高效。
至今,XXL-JOB已接入多家公司的線上產品線,接入場景如電商業務,O2O業務和大數據做業等,截止最新統計時間爲止,XXL-JOB已接入的公司包括不限於:
- 一、大衆點評;
- 二、山東學而網絡科技有限公司;
- 三、安徽慧通互聯科技有限公司;
- 四、人人聚財金服;
- 五、上海棠棣信息科技股份有限公司
- 六、運滿滿
- 七、米其林 (中國區)
- 八、媽媽聯盟
- 九、九櫻天下(北京)信息技術有限公司
- 十、萬普拉斯科技有限公司(一加手機)
- 十一、上海億保健康管理有限公司
- 十二、海爾馨廚 (海爾)
- 1三、河南大紅包電子商務有限公司
- 1四、成都順點科技有限公司
- 1五、深圳市怡亞通
- 1六、深圳麥亞信科技股份有限公司
- 1七、上海博瑩科技信息技術有限公司
- 1八、中國平安科技有限公司
- 1九、杭州知時信息科技有限公司
- 20、博瑩科技(上海)有限公司
- 2一、成都依能股份有限責任公司
- 2二、湖南高陽通聯信息技術有限公司
- 2三、深圳市邦德文化發展有限公司
- 2四、福建阿思可網絡教育有限公司
- 2五、優信二手車
- 2六、上海悠遊堂投資發展股份有限公司
- 2七、北京粉筆藍天科技有限公司
- 2八、中秀科技(無錫)有限公司
- 2九、武漢空心科技有限公司
- 30、北京螞蟻風暴科技有限公司
- 3一、四川互宜達科技有限公司
- 3二、錢包行雲(北京)科技有限公司
- 3三、重慶欣才集團
- 3四、咪咕互動娛樂有限公司(中國移動)
- 3五、北京諾亦騰科技有限公司
- 3六、增加引擎(北京)信息技術有限公司
- 3七、北京英貝思科技有限公司
- 3八、剛泰集團
- 3九、深圳泰久信息系統股份有限公司
- 40、隨行付支付有限公司
- 4一、廣州瀚農網絡科技有限公司
- 4二、享點科技有限公司
- 4三、杭州比智科技有限公司
- 4四、圳臨界線網絡科技有限公司
- 4五、廣州知識圈網絡科技有限公司
- 4六、國譽商業上海有限公司
- 4七、海爾消費金融有限公司,嗨付、夠花 (海爾)
- 4八、廣州巴圖魯信息科技有限公司
- 4九、深圳市鵬海運電子數據交換有限公司
- 50、深圳市亞飛電子商務有限公司
- 5一、上海趣醫網絡有限公司
- 5二、聚金資本
- 5三、北京父母邦網絡科技有限公司
- 5四、中山元赫軟件科技有限公司
- 5五、中商惠民(北京)電子商務有限公司
- 5六、凱京集團
- 5七、華夏票聯(北京)科技有限公司
- 5八、拍拍貸
- 5九、北京尚德機構在線教育有限公司
- 60、任子行股份有限公司
- 6一、北京時態電子商務有限公司
- 6二、深圳卷皮網絡科技有限公司
- 6三、北京安博通科技股份有限公司
- 6四、將來無線網
- 6五、廈門瓷禧網絡有限公司
- 6六、北京遞藍科軟件股份有限公司
- 6七、鄭州創海軟件科技公司
- 6八、北京國槐信息科技有限公司
- 6九、浪潮軟件集團
- 70、多立恆(北京)信息技術有限公司
- 7一、廣州極迅客信息科技有限公司
- 7二、赫基(中國)集團股份有限公司
- 7三、海投匯
- 7四、上海潤益創業孵化器管理股份有限公司
- 7五、漢納森(廈門)數據股份有限公司
- 7六、安信信託
- 7七、嵐儒財富
- 7八、捷道軟件
- 7九、湖北享七網絡科技有限公司
- 80、湖南創發科技責任有限公司
- 8一、深圳小安時代互聯網金融服務有限公司
- 8二、湖北享七網絡科技有限公司
- 8三、錢包行雲(北京)科技有限公司
- 8四、360金融 (360)
- 8五、易企秀
- 8六、摩貝(上海)生物科技有限公司
- 8七、廣東芯智慧科技有限公司
- 8八、聯想集團 (聯想)
- 8九、怪獸充電
- 90、行圓汽車
- 9一、深圳店店通科技郵箱公司
- 9二、京東 (京東)
- 9三、米莊理財
- 9四、咖啡易融
- 9五、梧桐誠選
- 9六、恆大地產 (恆大)
- 9七、昆明龍慧
- 9八、上海澀瑤軟件
- 9九、易信 (網易)
- 100、銅板街
- 10一、杭州雲若網絡科技有限公司
- 10二、特百惠(中國)有限公司
- 10三、常山衆卡運力供應鏈管理有限公司
- 10四、深圳立創電子商務有限公司
- 10五、杭州智諾科技股份有限公司
- 10六、北京雲漾信息科技有限公司
- 10七、深圳市多銀科技有限公司
- 10八、親寶寶
- 10九、上海博卡軟件科技有限公司
- 1十、智慧樹在線教育平臺
- 1十一、米族金融
- 1十二、北京辰森世紀
- 11三、雲南滇醫通
- 11四、廣州市分領網絡科技有限責任公司
- 11五、浙江微能科技有限公司
- 11六、上海馨飛電子商務有限公司
- 11七、上海寶尊電子商務有限公司
- 11八、直客通科技技術有限公司
- 11九、科度科技有限公司
- 120、上海數慧系統技術有限公司
- 12一、個人醫藥網
- 12二、多粉平臺
- 12三、鐵甲二手機
- 12四、上海海新得數據技術有限公司
- 12五、深圳市珍愛網信息技術有限公司 (珍愛網)
- 12六、小蜜蜂
- 12七、吉榮數科技
- 12八、上海愷域信息科技有限公司
- 12九、廣州荔支網絡有限公司(荔枝FM)
- 130、杭州閃寶科技有限公司
- 13一、北京互聯新網科技發展有限公司
- 13二、譽道科技
- 13三、山西兆盛房地產開發有限公司
- ……
更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。
歡迎你們的關注和使用,XXL-JOB也將擁抱變化,持續發展。
源碼倉庫地址 | Release Download |
---|---|
https://github.com/xuxueli/xxl-job | Download |
http://gitee.com/xuxueli0323/xxl-job | Download |
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新穩定版本}</version>
</dependency>
請下載項目源碼並解壓,獲取 "調度數據庫初始化SQL腳本" 並執行便可,正常狀況下應該生成16張表。
"調度數據庫初始化SQL腳本" 位置爲:
/xxl-job/doc/db/tables_xxl_job.sql
調度中心支持集羣部署,集羣狀況下各節點務必鏈接同一個mysql實例;
若是mysql作主從,調度中心集羣節點務必強制走主庫;
解壓源碼,按照maven格式將源碼導入IDE, 使用maven進行編譯便可,源碼結構以下:
xxl-job-admin:調度中心
xxl-job-core:公共依賴
xxl-job-executor:執行器Sample示例(選擇合適的版本執行器,可直接使用,也能夠參考其並將現有項目改形成執行器)
:xxl-job-executor-sample-spring:Spring版本,經過Spring容器管理執行器,比較通用,推薦這種方式;
:xxl-job-executor-sample-springboot:Springboot版本,經過Springboot管理執行器;
:xxl-job-executor-sample-jfinal:JFinal版本,經過JFinal管理執行器;
:xxl-job-executor-sample-nutz:Nutz版本,經過Nutz管理執行器;
調度中心項目:xxl-job-admin
做用:統一管理任務調度平臺上調度任務,負責觸發調度執行,而且提供任務管理平臺。
調度中心配置文件地址:
/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
調度中心配置內容說明:
### 調度中心JDBC連接:連接地址請保持和 2.1章節 所建立的調度數據庫的地址一致
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 報警郵箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
### 登陸帳號
xxl.job.login.username=admin
xxl.job.login.password=123456
### 調度中心通信TOKEN,非空時啓用
xxl.job.accessToken=
### 調度中心國際化設置,默認爲中文版本,值設置爲「en」時切換爲英文版本
xxl.job.i18n=
若是已經正確進行上述配置,可將項目編譯打包部署。 調度中心訪問地址:http://localhost:8080/xxl-job-admin (該地址執行器將會使用到,做爲回調地址),登陸後運行界面以下圖所示
至此「調度中心」項目已經部署成功。
調度中心支持集羣部署,提高調度系統容災和可用性。
調度中心集羣部署時,幾點要求和建議:
// Docker地址:https://hub.docker.com/r/xuxueli/xxl-job-admin/
docker pull xuxueli/xxl-job-admin
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin
/**
* 如需自定義 mysql 等配置,可經過 "PARAMS" 指定;
* 配置項參考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin
「執行器」項目:xxl-job-executor-sample-spring (提供多種版本執行器供選擇,現以Spring版本爲例,可直接使用,也能夠參考其並將現有項目改形成執行器)
做用:負責接收「調度中心」的調度並執行;可直接部署執行器,也能夠將執行器集成到現有業務項目中。
確認pom文件中引入了 "xxl-job-core" 的maven依賴;
執行器配置,配置文件地址:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties
執行器配置,配置內容說明:
### xxl-job admin address list:調度中心部署跟地址:如調度中心集羣部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回調"。
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job executor address:執行器"AppName"和地址信息配置:AppName執行器心跳註冊分組依據;地址信息用於"調度中心請求並觸發任務"和"執行器註冊"。執行器默認端口爲9999,執行器IP默認爲空表示自動獲取IP,多網卡時可手動設置指定IP,該IP不會綁定Host僅做爲通信實用。單機部署多個執行器時,注意要配置不一樣執行器端口;
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job, access token:執行器通信TOKEN,非空時啓用
xxl.job.accessToken=
### xxl-job log path:執行器運行日誌文件存儲的磁盤位置,須要對該路徑擁有讀寫權限
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/
### xxl-job log retention days:執行器Log文件按期清理功能,指定日誌保存天數,日誌文件過時自動刪除。限制至少保持3天,不然功能不生效;
xxl.job.executor.logretentiondays=-1
執行器組件,配置文件地址:
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml
執行器組件,配置內容說明:
<!-- 配置0一、JobHandler 掃描路徑:自動掃描容器中JobHandler -->
<context:component-scan base-package="com.xxl.job.executor.service.jobhandler" />
<!-- 配置0二、執行器 -->
<bean id="xxlJobExecutor" class="com.xxl.job.core.executor.XxlJobExecutor" init-method="start" destroy-method="destroy" >
<!-- 執行器註冊中心地址[選填],爲空則關閉自動註冊 -->
<property name="adminAddresses" value="${xxl.job.admin.addresses}" />
<!-- 執行器AppName[選填],爲空則關閉自動註冊 -->
<property name="appName" value="${xxl.job.executor.appname}" />
<!-- 執行器IP[選填],爲空則自動獲取 -->
<property name="ip" value="${xxl.job.executor.ip}" />
<!-- 執行器端口號[選填],小於等於0則自動獲取 -->
<property name="port" value="${xxl.job.executor.port}" />
<!-- 訪問令牌[選填],非空則進行匹配校驗 -->
<property name="accessToken" value="${xxl.job.accessToken}" />
<!-- 執行器日誌路徑[選填],爲空則使用默認路徑 -->
<property name="logPath" value="${xxl.job.executor.logpath}" />
<!-- 日誌保存天數[選填],值大於3時生效 -->
<property name="logRetentionDays" value="${xxl.job.executor.logretentiondays}" />
</bean>
若是已經正確進行上述配置,可將執行器項目編譯打部署,系統提供多種執行器Sample示例項目,選擇其中一個便可,各自的部署方式以下。
xxl-job-executor-sample-springboot:項目編譯打包成springboot類型的可執行JAR包,命令啓動便可;
xxl-job-executor-sample-spring:項目編譯打包成WAR包,並部署到tomcat中。
xxl-job-executor-sample-jfinal:同上
xxl-job-executor-sample-nutz:同上
至此「執行器」項目已經部署結束。
執行器支持集羣部署,提高調度系統可用性,同時提高任務處理能力。
執行器集羣部署時,幾點要求和建議:
本示例以新建一個 「GLUE模式(Java)」 運行模式的任務爲例。更多有關任務的詳細配置,請查看「章節三:任務詳解」。 ( 「GLUE模式(Java)」的執行代碼託管到調度中心在線維護,相比「Bean模式任務」須要在執行器項目開發部署上線,更加簡便輕量)
前提:請確認「調度中心」和「執行器」項目已經成功部署並啓動;
登陸調度中心,點擊下圖所示「新建任務」按鈕,新建示例任務。而後,參考下面截圖中任務的參數配置,點擊保存。
請點擊任務右側 「GLUE」 按鈕,進入 「GLUE編輯器開發界面」 ,見下圖。「GLUE模式(Java)」 運行模式的任務默認已經初始化了示例任務代碼,即打印Hello World。 ( 「GLUE模式(Java)」 運行模式的任務其實是一段繼承自IJobHandler的Java類代碼,它在執行器項目中運行,可以使用@Resource/@Autowire注入執行器裏中的其餘服務,詳細介紹請查看第三章節)
請點擊任務右側 「執行」 按鈕,可手動觸發一次任務執行(一般狀況下,經過配置Cron表達式進行任務調度出發)。
請點擊任務右側 「日誌」 按鈕,可前往任務日誌界面查看任務日誌。 在任務日誌界面中,可查看該任務的歷史調度記錄以及每一次調度的任務調度信息、執行參數和執行信息。運行中的任務點擊右側的「執行日誌」按鈕,可進入日誌控制檯查看實時執行日誌。
在日誌控制檯,能夠Rolling方式實時查看任務在執行器一側運行輸出的日誌信息,實時監控任務進度;
- 執行器:任務的綁定的執行器,任務觸發調度時將會自動發現註冊成功的執行器, 實現任務自動發現功能; 另外一方面也能夠方便的進行任務分組。每一個任務必須綁定一個執行器, 可在 "執行器管理" 進行設置;
- 任務描述:任務的描述信息,便於任務管理;
- 路由策略:當執行器集羣部署時,提供豐富的路由策略,包括;
FIRST(第一個):固定選擇第一個機器;
LAST(最後一個):固定選擇最後一個機器;
ROUND(輪詢):;
RANDOM(隨機):隨機選擇在線的機器;
CONSISTENT_HASH(一致性HASH):每一個任務按照Hash算法固定選擇某一臺機器,且全部任務均勻散列在不一樣機器上。
LEAST_FREQUENTLY_USED(最不常用):使用頻率最低的機器優先被選舉;
LEAST_RECENTLY_USED(最近最久未使用):最久爲使用的機器優先被選舉;
FAILOVER(故障轉移):按照順序依次進行心跳檢測,第一個心跳檢測成功的機器選定爲目標執行器併發起調度;
BUSYOVER(忙碌轉移):按照順序依次進行空閒檢測,第一個空閒檢測成功的機器選定爲目標執行器併發起調度;
SHARDING_BROADCAST(分片廣播):廣播觸發對應集羣中全部機器執行一次任務,同時系統自動傳遞分片參數;可根據分片參數開發分片任務;
- Cron:觸發任務執行的Cron表達式;
- 運行模式:
BEAN模式:任務以JobHandler方式維護在執行器端;須要結合 "JobHandler" 屬性匹配執行器中任務;
GLUE模式(Java):任務以源碼方式維護在調度中心;該模式的任務其實是一段繼承自IJobHandler的Java類代碼並 "groovy" 源碼方式維護,它在執行器項目中運行,可以使用@Resource/@Autowire注入執行器裏中的其餘服務;
GLUE模式(Shell):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "shell" 腳本;
GLUE模式(Python):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "python" 腳本;
GLUE模式(PHP):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "php" 腳本;
GLUE模式(NodeJS):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "nodejs" 腳本;
GLUE模式(PowerShell):任務以源碼方式維護在調度中心;該模式的任務其實是一段 "PowerShell" 腳本;
- JobHandler:運行模式爲 "BEAN模式" 時生效,對應執行器中新開發的JobHandler類「@JobHandler」註解自定義的value值;
- 阻塞處理策略:調度過於密集執行器來不及處理時的處理策略;
單機串行(默認):調度請求進入單機執行器後,調度請求進入FIFO隊列並以串行方式運行;
丟棄後續調度:調度請求進入單機執行器後,發現執行器存在運行的調度任務,本次請求將會被丟棄並標記爲失敗;
覆蓋以前調度:調度請求進入單機執行器後,發現執行器存在運行的調度任務,將會終止運行中的調度任務並清空隊列,而後運行本地調度任務;
- 子任務:每一個任務都擁有一個惟一的任務ID(任務ID能夠從任務列表獲取),當本任務執行結束而且執行成功時,將會觸發子任務ID所對應的任務的一次主動調度。
- 任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
- 失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
- 報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;
- 負責人:任務的負責人;
- 執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;
任務邏輯以JobHandler的形式存在於「執行器」所在項目中,開發流程以下:
- 一、繼承"IJobHandler":「com.xxl.job.core.handler.IJobHandler」;
- 二、註冊到Spring容器:添加「@Component」註解,被Spring容器掃描爲Bean實例;
- 三、註冊到執行器工廠:添加「@JobHandler(value="自定義jobhandler名稱")」註解,註解value值對應的是調度中心新建任務的JobHandler屬性的值。
- 四、執行日誌:須要經過 "XxlJobLogger.log" 打印執行日誌;
(可參考Sample示例執行器中的DemoJobHandler,見下圖)
參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "BEAN模式",JobHandler屬性填寫任務註解「@JobHandler」中定義的值;
爲方便用戶參考與快速實用,示例執行器內原生提供多個Bean模式任務Handler,能夠直接配置實用,以下:
任務以源碼方式維護在調度中心,支持經過Web IDE在線更新,實時編譯和生效,所以不須要指定JobHandler。開發流程以下:
參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "GLUE模式(Java)";
選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(也能夠在IDE中開發完成後,複製粘貼到編輯中)。
版本回溯功能(支持30個版本的版本回溯):在GLUE任務的Web IDE界面,選擇右上角下拉框「版本回溯」,會列出該GLUE的更新歷史,選擇相應版本便可顯示該版本代碼,保存後GLUE代碼即回退到對應的歷史版本;
參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "GLUE模式(Shell)";
選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(也能夠在IDE中開發完成後,複製粘貼到編輯中)。
該模式的任務其實是一段 "shell" 腳本;
參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "GLUE模式(Python)";
選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(也能夠在IDE中開發完成後,複製粘貼到編輯中)。
該模式的任務其實是一段 "python" 腳本;
參考上文「配置屬性詳細說明」對新建的任務進行參數配置,運行模式選中 "GLUE模式(NodeJS)";
選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發(也能夠在IDE中開發完成後,複製粘貼到編輯中)。
該模式的任務其實是一段 "nodejS" 腳本;
同上
同上
點擊進入"執行器管理"界面, 以下圖:
一、"調度中心OnLine:"右側顯示在線的"調度中心"列表, 任務執行結束後, 將會以failover的模式進行回調調度中心通知執行結果, 避免回調的單點風險;
二、"執行器列表" 中顯示在線的執行器列表, 可經過"OnLine 機器"查看對應執行器的集羣機器。
點擊按鈕 "+新增執行器" 彈框以下圖, 可新增執行器配置:
AppName: 是每一個執行器集羣的惟一標示AppName, 執行器會週期性以AppName爲對象進行自動註冊。可經過該配置自動發現註冊成功的執行器, 供任務調度時使用;
名稱: 執行器的名稱, 由於AppName限制字母數字等組成,可讀性不強, 名稱爲了提升執行器的可讀性;
排序: 執行器的排序, 系統中須要執行器的地方,如任務新增, 將會按照該排序讀取可用的執行器列表;
註冊方式:調度中心獲取執行器地址的方式;
自動註冊:執行器自動進行執行器註冊,調度中心經過底層註冊表能夠動態發現執行器機器地址;
手動錄入:人工手動錄入執行器的地址信息,多地址逗號分隔,供調度中心使用;
機器地址:"註冊方式"爲"手動錄入"時有效,支持人工維護執行器的地址信息;
進入任務管理界面,點擊「新增任務」按鈕,在彈出的「新增任務」界面配置任務屬性後保存便可。詳情頁參考章節 "3、任務詳解"。
進入任務管理界面,選中指定任務。點擊該任務右側「編輯」按鈕,在彈出的「編輯任務」界面更新任務屬性後保存便可,能夠修改設置的任務屬性信息:
該操做僅針對GLUE任務。
選中指定任務,點擊該任務右側「GLUE」按鈕,將會前往GLUE任務的Web IDE界面,在該界面支持對任務代碼進行開發。可參考章節 "3.2 GLUE模式(Java)"。
可對任務進行「啓動」和「中止」操做。 須要注意的是,此處的啓動/中止僅針對任務的後續調度觸發行爲,不會影響到已經觸發的調度任務,如需終止已經觸發的調度任務,可查看「4.8 終止運行中的任務」
點擊「執行」按鈕,可手動觸發一次任務調度,不影響原有調度規則。
點擊「日誌」按鈕,能夠查看任務歷史調度日誌。在歷史調入日誌界面可查看每次任務調度的調度結果、執行結果等,點擊「執行日誌」按鈕可查看執行器完整日誌。
調度時間:"調度中心"觸發本次調度並向"執行器"發送任務執行信號的時間;
調度結果:"調度中心"觸發本次調度的結果,200表示成功,500或其餘表示失敗;
調度備註:"調度中心"觸發本次調度的日誌信息;
執行器地址:本次任務執行的機器地址
運行模式:觸發調度時任務的運行模式,運行模式可參考章節 "3、任務詳解";
任務參數:本地任務執行的入參
執行時間:"執行器"中本次任務執行結束後回調的時間;
執行結果:"執行器"中本次任務執行的結果,200表示成功,500或其餘表示失敗;
執行備註:"執行器"中本次任務執行的日誌信息;
操做:
"執行日誌"按鈕:點擊可查看本地任務執行的詳細日誌信息;詳見「4.7 查看執行日誌」;
"終止任務"按鈕:點擊可終止本地調度對應執行器上本任務的執行線程,包括未執行的阻塞任務一併被終止;
點擊執行日誌右側的 「執行日誌」 按鈕,可跳轉至執行日誌界面,能夠查看業務代碼中打印的完整日誌,以下圖;
僅針對執行中的任務。 在任務日誌界面,點擊右側的「終止任務」按鈕,將會向本次任務對應的執行器發送任務終止請求,將會終止掉本次任務,同時會清空掉整個任務執行隊列。
任務終止時經過 "interrupt" 執行線程的方式實現, 將會觸發 "InterruptedException" 異常。所以若是JobHandler內部catch到了該異常並消化掉的話, 任務終止功能將不可用。
所以, 若是遇到上述任務終止不可用的狀況, 須要在JobHandler中應該針對 "InterruptedException" 異常進行特殊處理 (向上拋出) , 正確邏輯以下:
try{
// TODO
} catch (Exception e) {
if (e instanceof InterruptedException) {
throw e;
}
logger.warn("{}", e);
}
並且,在JobHandler中開啓子線程時,子線程也不可catch處理"InterruptedException",應該主動向上拋出。
在任務日誌界面,選中執行器和任務以後,點擊右側的"刪除"按鈕將會出現"日誌清理"彈框,彈框中支持選擇不一樣類型的日誌清理策略,選中後點擊"肯定"按鈕便可進行日誌清理操做;
點擊刪除按鈕,能夠刪除對應任務。
- /doc :文檔資料
- /db :「調度數據庫」建表腳本
- /xxl-job-admin :調度中心,項目源碼
- /xxl-job-core :公共Jar依賴
- /xxl-job-executor-samples :執行器,Sample示例項目(你們能夠在該項目上進行開發,也能夠將現有項目改造生成執行器項目)
XXL-JOB調度模塊基於Quartz集羣實現,其「調度數據庫」是在Quartz的11張集羣mysql表基礎上擴展而成。
XXL-JOB首先定製了Quartz原生表結構前綴(XXL_JOB_QRTZ_)。
而後,在此基礎上新增了幾張張擴展表,以下: - XXL_JOB_QRTZ_TRIGGER_GROUP:執行器信息表,維護任務執行器信息; - XXL_JOB_QRTZ_TRIGGER_REGISTRY:執行器註冊表,維護在線的執行器和調度中心機器地址信息; - XXL_JOB_QRTZ_TRIGGER_INFO:調度擴展信息表: 用於保存XXL-JOB調度任務的擴展信息,如任務分組、任務名、機器地址、執行器、執行入參和報警郵件等等; - XXL_JOB_QRTZ_TRIGGER_LOG:調度日誌表: 用於保存XXL-JOB任務調度的歷史信息,如調度結果、執行結果、調度入參、調度機器和執行器等等; - XXL_JOB_QRTZ_TRIGGER_LOGGLUE:任務GLUE日誌:用於保存GLUE更新歷史,用於支持GLUE的版本回溯功能;
所以,XXL-JOB調度數據庫共計用於16張數據庫表。
將調度行爲抽象造成「調度中心」公共平臺,而平臺自身並不承擔業務邏輯,「調度中心」負責發起調度請求。
將任務抽象成分散的JobHandler,交由「執行器」統一管理,「執行器」負責接收調度請求並執行對應的JobHandler中業務邏輯。
所以,「調度」和「任務」兩部分能夠相互解耦,提升系統總體穩定性和擴展性;
Quartz做爲開源做業調度中的佼佼者,是做業調度的首選。可是集羣環境中Quartz採用API的方式對任務進行管理,從而能夠避免上述問題,可是一樣存在如下問題:
XXL-JOB彌補了quartz的上述不足之處。
常規Quartz的開發,任務邏輯通常維護在QuartzJobBean中,耦合很嚴重。XXL-JOB中「調度模塊」和「任務模塊」徹底解耦,調度模塊中的全部調度任務使用同一個QuartzJobBean,即RemoteHttpJobBean。不一樣的調度任務將各自參數維護在各自擴展表數據中,當觸發RemoteHttpJobBean執行時,將會解析不一樣的任務參數發起遠程調用,調用各自的遠程執行器服務。
這種調用模型相似RPC調用,RemoteHttpJobBean提供調用代理的功能,而執行器提供遠程服務的功能。
基於Quartz的集羣方案,數據庫選用Mysql;集羣分佈式併發環境中使用QUARTZ定時任務調度,會在各個節點會上報任務,存到數據庫中,執行時會從數據庫中取出觸發器來執行,若是觸發器的名稱和執行時間相同,則只有一個節點去執行此任務。
# for cluster
org.quartz.jobStore.tablePrefix = XXL_JOB_QRTZ_
org.quartz.scheduler.instanceId: AUTO
org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.isClustered: true
org.quartz.jobStore.clusterCheckinInterval: 1000
調度採用線程池方式實現,避免單線程因阻塞而引發任務調度延遲。
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 50
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
XXL-JOB調度模塊的「調度中心」默認不使用該註解,即默認開啓並行機制,由於RemoteHttpJobBean爲公共QuartzJobBean,這樣在多線程調度的狀況下,調度模塊被阻塞的概率很低,大大提升了調度系統的承載量。
XXL-JOB的每一個調度任務雖然在調度模塊是並行調度執行的,可是任務調度傳遞到任務模塊的「執行器」確實串行執行的,同時支持任務終止。
錯過了觸發時間,處理規則。 可能緣由:服務重啓;調度線程被QuartzJobBean阻塞,線程被耗盡;某個任務啓用了@DisallowConcurrentExecution,上次調度持續阻塞,下次調度被錯過;
quartz.properties中關於misfire的閥值配置以下,單位毫秒:
org.quartz.jobStore.misfireThreshold: 60000
Misfire規則: withMisfireHandlingInstructionDoNothing:不觸發當即執行,等待下次調度; withMisfireHandlingInstructionIgnoreMisfires:以錯過的第一個頻率時間馬上開始執行; withMisfireHandlingInstructionFireAndProceed:以當前時間爲觸發頻率馬上觸發一次執行;
XXL-JOB默認misfire規則爲:withMisfireHandlingInstructionDoNothing
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobInfo.getJobCron()).withMisfireHandlingInstructionDoNothing();
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
調度模塊的「調度中心」做爲Web服務部署時,一方面承擔調度中心功能,另外一方面也爲執行器提供API服務。
調度中心提供的"日誌回調服務API服務"代碼位置以下:
xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
「執行器」在接收到任務執行請求後,執行任務,在執行結束以後會將執行結果回調通知「調度中心」:
執行器如若集羣部署,調度中心將會感知到在線的全部執行器,如「127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999」。
當任務"路由策略"選擇"故障轉移(FAILOVER)"時,當調度中心每次發起調度請求時,會按照順序對執行器發出心跳檢測請求,第一個檢測爲存活狀態的執行器將會被選定併發送調度請求。
調度成功後,可在日誌監控界面查看「調度備註」,以下;
「調度備註」能夠看出本地調度運行軌跡,執行器的"註冊方式"、"地址列表"和任務的"路由策略"。"故障轉移(FAILOVER)"路由策略下,調度中心首先對第一個地址進行心跳檢測,心跳失敗所以自動跳過,第二個依然心跳檢測失敗…… 直至心跳檢測第三個地址「127.0.0.1:9999」成功,選定爲「目標執行器」;而後對「目標執行器」發送調度請求,調度流程結束,等待執行器回調執行結果。
調度中心每次進行任務調度,都會記錄一條任務日誌,任務日誌主要包括如下三部份內容:
調度日誌,針對單次調度,屬性說明以下:
原理:XXL-JOB中每一個任務都對應有一個任務ID,同時,每一個任務支持設置屬性「子任務ID」,所以,經過「任務ID」能夠匹配任務依賴關係。
當父任務執行結束而且執行成功時,將會根據「子任務ID」匹配子任務依賴,若是匹配到子任務,將會主動觸發一次子任務的執行。
在任務日誌界面,點擊任務的「執行備註」的「查看」按鈕,能夠看到匹配子任務以及觸發子任務執行的日誌信息,如無信息則表示未觸發子任務執行,可參考下圖。
得益於上述兩點優化,理論上默認配置下的調度中心,單機可以支撐 5000 任務併發運行穩定運行;
實際場景中,因爲調度中心與執行器網絡ping延遲不一樣、DB讀寫耗時不一樣、任務調度密集程度不一樣,會致使任務量上限會上下波動。
如若須要支撐更多的任務量,能夠經過 "調大調度線程數" 、"下降調度中心與執行器ping延遲" 和 "提高機器配置" 幾種方式優化。
開發步驟:可參考 "章節三" ; 原理:每一個Bean模式任務都是一個Spring的Bean類實例,它被維護在「執行器」項目的Spring容器中。任務類須要加「@JobHandler(value="名稱")」註解,由於「執行器」會根據該註解識別Spring容器中的任務。任務類須要繼承統一接口「IJobHandler」,任務邏輯在execute方法中開發,由於「執行器」在接收到調度中心的調度請求時,將會調用「IJobHandler」的execute方法,執行任務邏輯。
開發步驟:可參考 "章節三" ; 原理:每一個 "GLUE模式(Java)" 任務的代碼,其實是「一個繼承自「IJobHandler」的實現類的類代碼」,「執行器」接收到「調度中心」的調度請求時,會經過Groovy類加載器加載此代碼,實例化成Java對象,同時注入此代碼中聲明的Spring服務(請確保Glue代碼中的服務和類引用在「執行器」項目中存在),而後調用該對象的execute方法,執行任務邏輯。
開發步驟:可參考 "章節三" ; 原理:腳本任務的源碼託管在調度中心,腳本邏輯在執行器運行。當觸發腳本任務時,執行器會加載腳本源碼在執行器機器上生成一份腳本文件,而後經過Java代碼調用該腳本;而且實時將腳本輸出日誌寫到任務日誌文件中,從而在調度中心能夠實時監控腳本運行狀況;
目前支持的腳本類型以下:
- shell腳本:任務運行模式選擇爲 "GLUE模式(Shell)"時支持 "shell" 腳本任務;
- python腳本:任務運行模式選擇爲 "GLUE模式(Python)"時支持 "python" 腳本任務;
- nodejs腳本:務運行模式選擇爲 "GLUE模式(NodeJS)"時支持 "nodejs" 腳本任務;
腳本任務經過 Exit Code 判斷任務執行結果,狀態碼可參考章節 "5.15 任務執行結果說明";
執行器其實是一個內嵌的Jetty服務器,默認端口9999(配置項:xxl.job.executor.port)。
在項目啓動時,執行器會經過「@JobHandler」識別Spring容器中「Bean模式任務」,以註解的value屬性爲key管理起來。
「執行器」接收到「調度中心」的調度請求時,若是任務類型爲「Bean模式」,將會匹配Spring容器中的「Bean模式任務」,而後調用其execute方法,執行任務邏輯。若是任務類型爲「GLUE模式」,將會加載GLue代碼,實例化Java對象,注入依賴的Spring服務(注意:Glue代碼中注入的Spring服務,必須存在與該「執行器」項目的Spring容器中),而後調用execute方法,執行任務邏輯。
XXL-JOB會爲每次調度請求生成一個單獨的日誌文件,須要經過 "XxlJobLogger.log" 打印執行日誌,「調度中心」查看執行日誌時將會加載對應的日誌文件。
(歷史版本經過重寫LOG4J的Appender實現,存在依賴限制,該方式在新版本已經被拋棄)
日誌文件存放的位置可在「執行器」配置文件進行自定義,默認目錄格式爲:/data/applogs/xxl-job/jobhandler/「格式化日期」/「數據庫調度日誌記錄的主鍵ID.log」。
在JobHandler中開啓子線程時,子線程將會將會把日誌打印在父線程即JobHandler的執行日誌中,方便日誌追蹤。
- 一、「調度中心」向「執行器」發送http調度請求: 「執行器」中接收請求的服務,其實是一臺內嵌jetty服務器,默認端口9999;
- 二、「執行器」執行任務邏輯;
- 三、「執行器」http回調「調度中心」調度結果: 「調度中心」中接收回調的服務,是針對執行器開放一套API服務;
調度中心向執行器發送的調度請求時使用RequestModel和ResponseModel兩個對象封裝調度請求參數和響應數據, 在進行通信以前底層會將上述兩個對象對象序列化,並進行數據協議以及時間戳檢驗,從而達到數據加密的功能;
自v1.5版本以後, 任務取消了"任務執行機器"屬性, 改成經過任務註冊和自動發現的方式, 動態獲取遠程執行器地址並執行。
AppName: 每一個執行器機器集羣的惟一標示, 任務註冊以 "執行器" 爲最小粒度進行註冊; 每一個任務經過其綁定的執行器可感知對應的執行器機器列表;
註冊表: 見"XXL_JOB_QRTZ_TRIGGER_REGISTRY"表, "執行器" 在進行任務註冊時將會週期性維護一條註冊記錄,即機器地址和AppName的綁定關係; "調度中心" 從而能夠動態感知每一個AppName在線的機器列表;
執行器註冊: 任務註冊Beat週期默認30s; 執行器以一倍Beat進行執行器註冊, 調度中心以一倍Beat進行動態任務發現; 註冊信息的失效時間被三倍Beat;
執行器註冊摘除:執行器銷燬時,將會主動上報調度中心並摘除對應的執行器機器信息,提升心跳註冊的實時性;
爲保證系統"輕量級"而且下降學習部署成本,沒有采用Zookeeper做爲註冊中心,採用DB方式進行任務註冊發現;
自v1.6.2以後,任務執行結果經過 "IJobHandler" 的返回值 "ReturnT" 進行判斷; 當返回值符合 "ReturnT.code == ReturnT.SUCCESS_CODE" 時表示任務執行成功,不然表示任務執行失敗,並且能夠經過 "ReturnT.msg" 回調錯誤信息給調度中心; 從而,在任務邏輯中能夠方便的控制任務執行結果;
執行器集羣部署時,任務路由策略選擇"分片廣播"狀況下,一次任務調度將會廣播觸發對應集羣中全部執行器執行一次任務,同時系統自動傳遞分片參數;可根據分片參數開發分片任務;
"分片廣播" 以執行器爲維度進行分片,支持動態擴容執行器集羣從而動態增長分片數量,協同進行業務處理;在進行大數據量業務操做時可顯著提高任務處理能力和速度。
"分片廣播" 和普通任務開發流程一致,不一樣之處在於能夠能夠獲取分片參數,獲取分片參數進行分片業務處理。
// 可參考Sample示例執行器中的示例任務"ShardingJobHandler"瞭解試用
ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
// 腳本任務入參固定爲三個,依次爲:任務傳參、分片序號、分片總數。以Shell模式任務爲例,獲取分片參數代碼以下
echo "分片序號 index = $2"
echo "分片總數 total = $3"
分片參數屬性說明:
index:當前分片序號(從0開始),執行器集羣列表中當前執行器的序號;
total:總分片數,執行器集羣的總機器數量;
該特性適用場景如:
爲提高系統安全性,調度中心和執行器進行安全性校驗,雙方AccessToken匹配才容許通信;
調度中心和執行器,可經過配置項 "xxl.job.accessToken" 進行AccessToken的設置。
調度中心和執行器,若是須要正常通信,只有兩種設置;
調度中心提供了API服務,主要分爲兩種類型:
一、任務結果回調服務;
二、執行器註冊服務;
三、執行器註冊摘除服務;
四、觸發任務單次執行服務,支持任務根據業務事件觸發;
API服務位置:com.xxl.job.core.biz.AdminBiz.java
API服務請求參考代碼:com.xxl.job.adminbiz.AdminBizTest.java
一、任務列表查詢;
二、任務新增;
三、任務更新;
四、任務刪除;
五、任務啓動;
六、任務中止;
七、任務觸發;
API服務位置:com.xxl.job.admin.controller.JobInfoController.java
API服務請求參考代碼:可參考任務界面操做的ajax請求。任何ajax接口都可配置成爲API服務,只需在待啓用的API服務上添加 「@PermessionLimit(limit = false)」 註解取消登錄態攔截便可;
執行器提供了API服務,供調度中心選擇使用,目前提供的API服務有:
一、心跳檢測:調度中心使用
二、忙碌檢測:調度中心使用
三、觸發任務執行:調度中心使用;本地進行任務開發時,可以使用該API服務模擬觸發任務;
四、獲取Rolling Log:調度中心使用
五、終止任務:調度中心使用
API服務位置:com.xxl.job.core.biz.ExecutorBiz
API服務請求參考代碼:com.xxl.job.executor.ExecutorBizTest
一次完整任務流程包括"調度(調度中心) + 執行(執行器)"兩個階段。
調度中心與業務解耦,只需部署一次後常年不須要維護。可是,執行器中託管運行着業務做業,做業上線和變動須要重啓執行器,尤爲是Bean模式任務。 執行器重啓可能會中斷運行中的任務。可是,XXL-JOB得益於自建執行器與自建註冊中心,能夠經過灰度上線的方式,避免因重啓致使的任務中斷的問題。
步驟以下:
系統根據如下標準判斷任務執行結果,可參考之。
-- | Bean/Glue(Java) | Glue(Shell) 等腳本任務 |
---|---|---|
成功 | IJobHandler.SUCCESS | 0 |
失敗 | IJobHandler.FAIL | -1(非0狀態碼) |
支持設置任務超時時間,任務運行超時的狀況下,將會主動中斷任務;
須要注意的是,任務超時中斷時與任務終止機制(可查看「4.8 終止運行中的任務」)相似,也是經過 "interrupt" 中斷任務,所以業務代碼須要將 "InterruptedException" 外拋,不然功能不可用。
跨平臺、跨語言主要體如今如下兩個方面:
默認提供郵件失敗告警,可擴展短信、釘釘等方式,擴展代碼位置爲 "JobFailMonitorHelper.failAlarm";
能夠經過如下命令快速構建調度中心,並啓動運行;
mvn clean package
docker build -t xuxueli/xxl-job-admin ./xxl-job-admin
docker run --name xxl-job-admin -p 8080:8080 -d xuxueli/xxl-job-admin
調度密集或者耗時任務可能會致使任務阻塞,集羣狀況下調度組件小几率狀況下會重複觸發; 針對上述狀況,能夠經過結合 "單機路由策略(如:第一臺、一致性哈希)" + "阻塞策略(如:單機串行、丟棄後續調度)" 來規避,最終避免任務重複執行。
原生提供通用命令行任務Handler(Bean任務,"CommandJobHandler");業務方只須要提供命令行便可; 如任務參數 "pwd" 將會執行命令並輸出數據;
【於V1.1.x版本,XXL-JOB正式應用於我司,內部定製別名爲 「Ferrari」,新接入應用推薦使用最新版本】
一、支持任務分組;
二、支持「本地任務」、「遠程任務」;
三、底層通信支持兩種方式,Servlet方式 + JETTY方式;
四、支持「任務日誌」;
五、支持「串行執行」,並行執行;
說明:V1.2版本將系統架構按功能拆分爲:
- 調度模塊(調度中心):負責管理調度信息,按照調度配置發出調度請求;
- 執行模塊(執行器):負責接收調度請求並執行任務邏輯;
- 通信模塊:負責調度模塊和任務模塊之間的信息通信;
優勢:
- 解耦:任務模塊提供任務接口,調度模塊維護調度信息,業務相互獨立;
- 高擴展性;
- 穩定性;
一、遺棄「本地任務」模式,推薦使用「遠程任務」,易於系統解耦,任務對應的JobHandler統稱爲「執行器」;
二、遺棄「servlet」方式底層系統通信,推薦使用JETTY方式,調度+回調雙向通信,重構通信邏輯;
三、UI交互優化:左側菜單展開狀態優化,菜單項選中狀態優化,任務列表打開表格有壓縮優化;
四、【重要】「執行器」細分爲:BEAN、GLUE兩種開發模式,簡介見下文:
「執行器」 模式簡介: - BEAN模式執行器:每一個執行器都是Spring的一個Bean實例,XXL-JOB經過註解@JobHandler識別和調度執行器; -GLUE模式執行器:每一個執行器對應一段代碼,在線Web編輯和維護,動態編譯生效,執行器負責加載GLUE代碼和執行;
Tips: 歷史版本(V1.3.x)目前已經Release至穩定版本, 進入維護階段, 地址見分支 V1.3 。新特性將會在master分支持續更新。
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新穩定版}</version>
</dependency>
歡迎參與項目貢獻!好比提交PR修復一個bug,或者新建 Issue 討論新特性或者變動。
更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。
產品開源免費,而且將持續提供免費的社區技術支持。我的或企業內部可自由的接入和使用。