xxl-job是一個開源的任務調度平臺(github地址https://github.com/xuxueli/xxl-job),且在分佈式場景下有很好的支持性,能夠對單個的任務單次執行,或者定時執行。在分佈式場景下,能夠選擇不一樣的路由策略進行執行job,如指定第一個或最後一個執行器執行,輪詢執行等等,十分的靈活,下面介紹下在java環境下如何對接xxl-job的平臺。php
1、調度中心的配置部署java
xxl-job做爲開源的項目,他支持多種語言的任務,可是其調度平臺是由java語言編寫,基於集羣Quartz實現的。調度平臺負責任務的分發,路由,執行週期,執行策略等,首先從github上(https://github.com/xuxueli/xxl-job)下載該項目,而後在文件路徑爲/xxl-job/xxl-job-admin/src/main/resources/下找到配置文件xxl-job-admin.properties,進行以下配置node
### 調度中心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 ,便可看到xxl-job的頁面python
2、配置java的執行器mysql
xxl-job的調度器所有是開源的代碼,只須要修改配置便可,執行器部分就須要咱們本身進行開發,首先,pom.xml文件中引入依賴git
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>1.8.2</version> </dependency>
而後在你的執行器的項目中的配置文件中加入xxl-job相關配置github
#xxl-job 調度中心工程的地址 xxl.job.admin.addresses=http://localhost:8999/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-ots-server xxl.job.executor.ip= xxl.job.executor.port=9946 ### xxl-job log path xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ ### xxl-job, access token xxl.job.accessToken=
而後編寫xxl-job配置類算法
package com.test.config; import com.xxl.job.core.executor.XxlJobExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan(basePackages = "com.test.task") //basePackages指向實現了接口IJobHandle的類所在包 public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}") private String addresses; @Value("${xxl.job.executor.appname}") private String appname; @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.accessToken}") private String accessToken; @Bean(initMethod = "start", destroyMethod = "destroy") public XxlJobExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> xxl-job config init."); XxlJobExecutor xxlJobExecutor = new XxlJobExecutor(); xxlJobExecutor.setIp(ip); xxlJobExecutor.setPort(port); xxlJobExecutor.setAppName(appname); xxlJobExecutor.setAdminAddresses(addresses); xxlJobExecutor.setLogPath(logpath); xxlJobExecutor.setAccessToken(accessToken); return xxlJobExecutor; } } !
最後編寫xxl-job的執行器的類spring
package com.test.task; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.JobHander; import org.springframework.stereotype.Component; @Component @JobHander(value="testHello")//@JobHander 惟一標識一個任務。調度中心會查找這個惟一的名稱來啓動執行此類的execute方法。 public class HelloWorld extends IJobHandler { @Override public ReturnT<String> execute(String... strings) throws Exception { System.out.println("hello,boy."); return ReturnT.SUCCESS; } }
而後將含有xxl-job執行器的項目啓動便可sql
3、任務的執行
首先,配置執行器
而後在任務管理界面配置任務
任務配置界面各參賽含有以下
- 執行器:任務的綁定的執行器,任務觸發調度時將會自動發現註冊成功的執行器, 實現任務自動發現功能; 另外一方面也能夠方便的進行任務分組。每一個任務必須綁定一個執行器, 可在 "執行器管理" 進行設置; - 任務描述:任務的描述信息,便於任務管理; - 路由策略:當執行器集羣部署時,提供豐富的路由策略,包括; 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所對應的任務的一次主動調度。 - 任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務; - 失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試; - 報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔; - 負責人:任務的負責人; - 執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;
咱們上面配置的項目就是BEAN模式的,其餘模式的代碼都會維護在調度平臺裏。