使用分布式任務調度平台xxl-job


一.下載源碼

https://github.com/xuxueli/xxl-job/releases

二.准備環境

  1. 在MySQL5.6+上執行源碼目錄下\doc\db\tables_xxl_job.sql腳本(腳本中初始化了一個賬戶,一個執行器)
  2. 使用idea導入源碼目錄下\xxl-job-admin的maven項目
  3. 修改\xxl-job-admin(下面簡稱admin)項目application.properties中數據庫配置,改為自己本地
  4. admin是基於Springboot,按照Springboot方式即可啟動。
  5. 根據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中的任務,接入完成。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM