Spring boot下,集成任務調度中心(XXL-JOB)

1、使用背景

  目前項目中,採用的是微服務框架,因爲在微服務中,存在須要定時的任務。但若是定時任務維護在每一個微服務下,當微服務部署多個實例的狀況下,會出現定事任務屢次執行的狀況。而且在解決問題的基礎上,但願可以實現動態修改任務的定時時間,能夠經過頁面對定時任務進行控制。mysql

2、XXL-JOB簡單介紹

  首先,XXL-JOB是一個輕量級分佈式任務調度平臺,內容採用了Quartz定時框架實現,服務之間通訊經過RPC的方式實現。git

  其次,在功能方面:github

  1. 支持經過web頁面對任務進行增刪改查操做
  2. 支持動態修改任務狀態、啓動、中止等,即時生效。
  3. 支持多種阻塞處理策略,如串行、丟棄後續調度、覆蓋以前調度
  4. 支持超時控制、失敗重試、郵件報警等處理
  5. ......

  詳情可參考官方網站:http://www.xuxueli.com/xxl-jobweb

3、服務端實現過程

  一、XXL-JOB源碼下載:

    github地址:https://github.com/xuxueli/xxl-jobspring

    其中,xxl-job-core爲核心代碼塊,xxl-job-admin爲任務調度中心管理模塊,部署的話,部署xxl-job-admin便可。sql

  二、數據庫建立:

    sql文件爲:xxl-job/doc/db/tables_xxl_job.sql,在mysql數據庫中執行該sql,能生成新的數據庫xxl-job及相關的數據庫表xxl_job_*。數據庫

    目前從源碼來看,暫時只支持mysql數據庫,如需支持其餘數據庫,可在源碼上進行相關的修改:如mybatis的配置、sql語句等。服務器

  三、xxl-job-admin模塊配置修改:

    修改xxl-job-admin下的配置文件:application.propertiesmybatis

    在配置文件中,主要須要修改數據庫地址(spring.datasource.url)、用戶名(spring.datasource.username)、密碼的配置(spring.datasource.password)爲實際的部署環境。app

    端口號(server.port)默認爲8080,可修改。

    訪問地址(server.context-path)默認爲xxl-job-admin,可修改。

  四、啓動xxl-job-admin微服務:

    啓動成功後,可經過訪問http://localhost:8080/xxl-job-admin來對任務調度中心進行訪問。

    用戶名密碼默認爲:admin/123456

 

4、客戶端(微服務模塊)實現過程:

  一、引用依賴:

    pom.xml中,增長依賴:

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.0.2</version>
</dependency>

 

  二、修改配置文件:

    本文采用yml配置文件,增長配置以下:

xxl:
  job:
    admin:
      addresses: http://localhost:8080/xxl-job-admin
    executor:
      ip:
      port: 9999
      logpath: /data/applogs/xxl-job/jobhandler
      appname: plat-job
    accessToken:

    其中ip可不填,會自動識別註冊。

  三、編寫Configuration類

    此處須要注意版本差別,因爲服務器端採用的是V2+,客戶端也須要採用V2+。否則會有異常。

    V2+的配置類代碼以下:

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class XxlJobConfig {

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @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.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    private int logRetentionDays=-1;

    @Bean(initMethod = "start", destroyMethod = "destroy")
    public XxlJobSpringExecutor xxlJobExecutor() {
        System.out.println(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppName(appName);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }
}

 

  四、編寫Handler類(實際處理任務):  

    代碼以下所示:

 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.IJobHandler;
 import com.xxl.job.core.handler.annotation.JobHandler;

@JobHandler(value="TestHandler")
@Component
public class TestHandler extends IJobHandler {

    @Override
    public ReturnT<String> execute(String param) throws Exception {
        System.out.println("執行了TestHandler一次");
return SUCCESS; } }

    在上面代碼中,Handler的命名爲「TestHandler」,此命名須要是惟一的,後續再服務器中配置會用到。

  五、啓動客戶端(微服務):

    啓動成功後,會自動在服務器中,增長一個名爲【plat-job】的執行器,用來執行定時任務。

 

5、服務器端頁面中進行配置:

  一、修改執行器:

    訪問服務器頁面登陸成功後,點擊執行器管理,如圖:

    

 

    對執行器進行編輯,註冊方式改成【手動錄入】,機器地址寫入客戶端(微服務)具體的ip:port後,點擊保存。

  二、任務管理編輯:

    點擊【任務管理】頁籤【新增】按鈕,執行器選擇plat-job,JobHandler編寫爲【TestHandler】,Cron爲定時計劃,如圖所示:

    保存後,可點擊【執行】按鈕,查看是否調用了客戶端的Handler處理。在此再也不演示。如可執行,則點擊【啓動】按鈕,會在定時計劃內,再次調用Handler處理。

    同時,在對任務的Cron進行修改、保存後,會動態的更新定時計劃,實現了項目中的指望。

 

    因爲每一個微服務的ip和port能夠在執行器的機器地址中,經過逗號分隔的方式,可增長多個客戶端的地址,則解決了項目中多實例的問題。

相關文章
相關標籤/搜索