關於分佈式任務調度平臺XXL-JOB,其實做者 許雪裏 在其發佈的中文教程中已經介紹的很清楚了,這裏我就不作過多的介紹了,關於其搭建教程,本人依照其文檔搭建起來基本上也沒遇到啥問題,這裏經過博客的形式記錄下來。html
①、GitHub:https://github.com/xuxueli/xxl-jobnode
②、碼雲:https://gitee.com/xuxueli0323/xxl-jobpython
①、中文文檔:http://www.xuxueli.com/xxl-job/#/mysql
②、英文文檔:http://www.xuxueli.com/xxl-job/en/#/git
經過上面給出的源碼下載地址,咱們將源碼clone到IDEA中,以下:github
初始化腳本在上面源碼目錄的 /doc/db/tables_xxl_job.sql ,將此腳本在MySQL數據庫中執行一遍。算法
執行完畢,會在MySQL數據庫中生成以下 16 張表:spring
調度中心就是源碼中的 xxl-job-admin 工程,咱們須要將其配置成本身須要的調度中心,經過該工程咱們可以以圖形化的方式統一管理任務調度平臺上調度任務,負責觸發調度執行。sql
文件地址:/xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
配置文件說明:
1 ### 一、調度中心項目的端口號以及訪問路徑 2 server.port=8080 3 server.context-path=/xxl-job-admin 4 5 ### 二、配置靜態文件的前綴 6 spring.mvc.static-path-pattern=/static/** 7 spring.resources.static-locations=classpath:/static/ 8 9 ### 三、配置模板文件 10 spring.freemarker.templateLoaderPath=classpath:/templates/ 11 spring.freemarker.suffix=.ftl 12 spring.freemarker.charset=UTF-8 13 spring.freemarker.request-context-attribute=request 14 spring.freemarker.settings.number_format=0.########## 15 16 ### 四、配置mybatis的mapper文件地址 17 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml 18 19 ### 五、配置數據庫的地址 20 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8 21 spring.datasource.username=root 22 spring.datasource.password=root_pwd 23 spring.datasource.driver-class-name=com.mysql.jdbc.Driver 24 25 spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource 26 spring.datasource.tomcat.max-wait=10000 27 spring.datasource.tomcat.max-active=30 28 spring.datasource.tomcat.test-on-borrow=true 29 spring.datasource.tomcat.validation-query=SELECT 1 30 spring.datasource.tomcat.validation-interval=30000 31 32 ### 六、配置報警郵箱 33 spring.mail.host=smtp.qq.com 34 spring.mail.port=25 35 spring.mail.username=xxx@qq.com 36 spring.mail.password=xxx 37 spring.mail.properties.mail.smtp.auth=true 38 spring.mail.properties.mail.smtp.starttls.enable=true 39 spring.mail.properties.mail.smtp.starttls.required=true 40 41 42 ### 七、管理界面的登陸用戶名密碼 43 xxl.job.login.username=admin 44 xxl.job.login.password=123456 45 46 ### 八、調度中心通信TOKEN,非空時啓用 47 xxl.job.accessToken= 48 49 ### 九、調度中心國際化設置,默認爲中文版本,值設置爲「en」時切換爲英文版本 50 xxl.job.i18n=
注意:基本上上面的配置文件咱們須要修改的只有第 5 點,修改數據庫的地址,這要與咱們前面初始化的數據庫名稱徑,用戶名密碼保持一致;
第二個就是修改第 6 點,報警郵箱,由於該工程任務失敗後有失敗告警功能,能夠經過郵件來提醒,若是咱們須要此功能,能夠配置一下。
該工程是一個springboot項目,咱們只須要在IDEA中執行 XxlJobAdminApplication 類便可運行該工程:
在瀏覽器輸入 http://localhost:8080/xxl-job-admin 而後輸入用戶名和密碼(前面配置文件中配置的),便可看到以下管理界面。
其實在源碼中,做者提供了各個版本的 執行器項目,下面我以建立一個 springboot 版本的執行器爲例來介紹。
這個執行器的地址爲:https://github.com/YSOcean/xxljobexecutordemo.git
在建立好的springboot 項目的pom.xml 文件中添加以下依賴:
1 <!-- xxl-rpc-core --> 2 <dependency> 3 <groupId>com.xuxueli</groupId> 4 <artifactId>xxl-job-core</artifactId> 5 <version>2.0.1</version> 6 </dependency>
在建立好的springboot 項目的配置文件 application.yml 添加以下配置:
1 server: 2 #項目端口號 3 port: 8081 4 logging: 5 #日誌文件 6 config: classpath:logback.xml 7 8 xxl: 9 job: 10 admin: 11 #調度中心部署跟地址:如調度中心集羣部署存在多個地址則用逗號分隔。 12 #執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回調"。 13 addresses: http://127.0.0.1:8080/xxl-job-admin 14 15 #分別配置執行器的名稱、ip地址、端口號 16 #注意:若是配置多個執行器時,防止端口衝突 17 executor: 18 appname: executorDemo 19 ip: 127.0.0.1 20 port: 9999 21 22 #執行器運行日誌文件存儲的磁盤位置,須要對該路徑擁有讀寫權限 23 logpath: /data/applogs/xxl-job/jobhandler 24 #執行器Log文件按期清理功能,指定日誌保存天數,日誌文件過時自動刪除。限制至少保持3天,不然功能不生效; 25 #-1表示永不刪除 26 logretentiondays: -1
這裏須要注意的是:配置執行器的名稱、IP地址、端口號,後面若是配置多個執行器時,要防止端口衝突。再就是執行器的名稱,咱們後面會到上一步的調度中心管理界面進行對應配置。
在項目中建立 XxlJobConfig.class 文件:
在項目中建立一個Handler,用於執行咱們想要執行的東西,這裏我只是簡單的打印一行日誌:
XXL-JOB, Hello World!!!
注意:這裏有個註解 @JobHandler(value="demoJobHandler"),對於 value的值,咱們會在下面進行相應配置。
調度中心前面咱們已經配置好了,啓動該配置中心,進入http://localhost:8080/xxl-job-admin 界面。
點擊 執行器管理----》新增執行器---》,以下以下界面,而後填充此表格,點擊保存便可。
下面是對這幾個參數的介紹:
AppName:是每一個執行器集羣的惟一標示AppName, 執行器會週期性以AppName爲對象進行自動註冊。可經過該配置自動發現註冊成功的執行器, 供任務調度時使用;
名稱:執行器的名稱, 由於AppName限制字母數字等組成,可讀性不強, 名稱爲了提升執行器的可讀性;
排序: 執行器的排序, 系統中須要執行器的地方,如任務新增, 將會按照該排序讀取可用的執行器列表;
註冊方式:調度中心獲取執行器地址的方式,
自動註冊:執行器自動進行執行器註冊,調度中心經過底層註冊表能夠動態發現執行器機器地址;
手動錄入:人工手動錄入執行器的地址信息,多地址逗號分隔,供調度中心使用;
機器地址:"註冊方式"爲"手動錄入"時有效,支持人工維護執行器的地址信息;
點擊 任務管理---》新增任務---》
執行器:任務的綁定的執行器,任務觸發調度時將會自動發現註冊成功的執行器, 實現任務自動發現功能; 另外一方面也能夠方便的進行任務分組。每一個任務必須綁定一個執行器, 可在 "執行器管理" 進行設置。
任務描述:任務的描述信息,便於任務管理;
路由策略:當執行器集羣部署時,提供豐富的路由策略,包括;
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所對應的任務的一次主動調度。
任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務;
失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;
報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;
負責人:任務的負責人;
執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;
配置完執行器以及任務,咱們只須要啓動該任務,即可以運行了。
啓動以後,咱們查看日誌:
咱們上面配置任務時的cron表達式是每秒鐘執行一次(0/1 * * * * ? *):
打印日誌以下:
注意:在項目中,只有經過 XxlJobLogger.log() 代碼才能將日誌打印到上面。