一.下載源碼
https://github.com/xuxueli/xxl-job/releases
二.准備環境
- 在MySQL5.6+上執行源碼目錄下\doc\db\tables_xxl_job.sql腳本(腳本中初始化了一個賬戶,一個執行器)
- 使用idea導入源碼目錄下\xxl-job-admin的maven項目
- 修改\xxl-job-admin(下面簡稱admin)項目application.properties中數據庫配置,改為自己本地
- admin是基於Springboot,按照Springboot方式即可啟動。
- 根據application.properties的配置,默認訪問地址為127.0.0.1:8080/xxl-job-admin,默認賬目密碼為admin/123456
三.接入調度任務
xxl-job采用調度與任務分離的模式,分為兩塊:調度中心(admin),任務(executor).上面啟動的即為admin,admin負責調度任務,控制任務的觸發時機以及路由策略。executor負責具體要執行的業務,即任務代碼寫在executor中。而工作中一般業務寫在service層,所以可以將executor接入到service層,然后將任務代碼寫到executor。下例中使用無框架的方式演示接入executor。
1.新建一個簡單maven項目,導入使用xxljob需要的包
<dependencies> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.1.0</version> </dependency> </dependencies>
2.創建executor配置類(使executor注冊業務到admin)
1 public class XxljobConfig { 2 3 private static final String ADMIN_ADDRESSES = "http://127.0.0.1:8080/xxl-job-admin"; 4 private static final String EXECUTOR_APPNAME = "txxljob"; // EXECUTOR_APPNAME需要先到admin配置 5 6 private static XxlJobExecutor xxlJobExecutor; 7 8 static { 9 // 實例化,此處僅配置了最基本的參數 10 xxlJobExecutor = new XxlJobExecutor(); 11 xxlJobExecutor.setAdminAddresses(ADMIN_ADDRESSES); 12 xxlJobExecutor.setAppName(EXECUTOR_APPNAME); 13 } 14 15 public static void start(int port) { 16 17 // 注冊需要調度的業務 18 initRegister(port); 19 20 // 啟動(注冊到調度中心) 21 try { 22 xxlJobExecutor.setPort(port); 23 xxlJobExecutor.start(); 24 System.out.println("xxljob成功注冊到調度中心"); 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 } 29 30 public static void destory() { 31 if (null != xxlJobExecutor) 32 xxlJobExecutor.destroy(); 33 } 34 35 private static void initRegister(int port) { 36 XxlJobExecutor.registJobHandler("XxljobDemoService", new XxljobDemoService(port)); // 注冊任務代碼到admin 37 } 38 39 }
注意上面代碼中EXECUTOR_APPNAME = "txxljob",需要先到admin中配置一個AppName為txxljob的執行器。可以將EXECUTOR_APPNAME看做是執行器的唯一標識,admin調度任務時先根據執行器找任務。

3.創建一個簡單的任務,讓調度中心調度
1 public class XxljobDemoService extends IJobHandler { 2 3 private final int port; 4 5 public XxljobDemoService(int port) { 6 this.port = port; 7 } 8 9 public ReturnT<String> execute(String s) { 10 System.out.println("demo業務" + port +"被調度中心調度"); 11 return SUCCESS; 12 } 13 }
注意:2中XxljobConfig中XxlJobExecutor.registJobHandler("XxljobDemoService", new XxljobDemoService(port))將XxljobDemoService注冊到調度中心。
4.創建兩個啟動類,模擬分布式環境
1 public class App1 { 2 3 public static void main(String[] args) throws InterruptedException { 4 XxljobConfig.start(9994); 5 while (true) { 6 TimeUnit.HOURS.sleep(1); 7 } 8 } 9 10 }
1 public class App2 { 2 3 public static void main(String[] args) throws InterruptedException { 4 XxljobConfig.start(9995); 5 while (true) { 6 TimeUnit.HOURS.sleep(1); 7 } 8 } 9 10 }
5.分別啟動App1和App2,將會注冊兩個實例到admin中
四.在admin中配置任務的執行規則以及策略

* 執行器:選中上面配置的自定義執行新txxljob(因為executor注冊時使用的是此執行器)
* 路由策略:由於注冊了兩個實例到admin,所以這里選擇輪詢,讓兩個實例都能得到執行,也可以選擇其他的路由策略
* 運行模式:BEAN是本文中使用的運行模式,即將業務代碼寫到獨立於admin的項目中,然后注冊到admin中。xxljob也支持在admin平台頁面中直接寫業務代碼的方式。
* Cron:即普通的cron表達式,控制任務的觸發時機
* JobHandler:可以看做是任務的索引,與代碼中保持一致
五.啟動四中配置的任務,觀察executor被調度情況

觀察App1和App2控制台輸出如下,說明admin可以正常調度App1和App2中的任務,接入完成。


