在開發中須要將已有的定時任務抽離出來,方便管理查看,所以選擇集成分佈式任務調度平臺 XXL-JOB,本文就講解下 Spring Boot 如何集成 XXL-JOB 任務調度平臺。java
XXL-JOB是一個分佈式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼並接入多家公司線上產品線,開箱即用。git
下面咱們在 Spring Boot 中集成 XXL-JOB 來完成定時任務的編寫(本文選擇的 XXL-JOB 版本爲 2.2.0)。github
Spring Boot 集成 XXL-JOB 主要分爲如下兩步:web
配置運行調度中心(xxl-job-admin)spring
配置運行執行器項目(xxl-job-executor)sql
首先從源碼倉庫中下載代碼,代碼地址有兩個:數據庫
GitHub:https://github.com/xuxueli/xxl-jobapp
Gitee:http://gitee.com/xuxueli0323/xxl-job分佈式
下載完以後,在 doc/db 目錄下有數據庫腳本 tables_xxl_job.sql,執行下腳本初始化調度數據庫 xxl_job,以下圖所示:ide
能夠根據須要修改 xxl-job-admin 的配置文件,主要是修改數據源信息,若須要用到郵件報警功能,須要配置郵箱。
而後啓動項目,正常啓動後,訪問地址爲:http://localhost:8080/xxl-job-admin,默認的帳戶爲 admin,密碼爲 123456,訪問後臺管理系統後臺,界面以下:
這樣就表示調度中心已經搞定了,下一步就是建立執行器項目。
建立一個項目,在項目中加入 xxl-job-core 依賴,項目依賴以下所示:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.0</version></dependency>
在配置文件 application.properties 中配置 xxl-job 執行器的相關參數,具體內容以下:
### 調度中心部署跟地址 [選填]:如調度中心集羣部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回調";爲空則關閉自動註冊;xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### 執行器通信TOKEN [選填]:非空時啓用;xxl.job.accessToken=### 執行器AppName [選填]:執行器心跳註冊分組依據;爲空則關閉自動註冊xxl.job.executor.appname=xxl-job-executor### 執行器註冊 [選填]:優先使用該配置做爲註冊地址,爲空時使用內嵌服務 」IP:PORT「 做爲註冊地址。從而更靈活的支持容器類型執行器動態IP和動態映射端口問題。xxl.job.executor.address=### 執行器IP [選填]:默認爲空表示自動獲取IP,多網卡時可手動設置指定IP,該IP不會綁定Host僅做爲通信的時候用;地址信息用於 "執行器註冊" 和 "調度中心請求並觸發任務";xxl.job.executor.ip=### 執行器端口號 [選填]:小於等於0則自動獲取;默認端口爲9999,單機部署多個執行器時,注意要配置不一樣執行器端口;xxl.job.executor.port=9999### 執行器運行日誌文件存儲磁盤路徑 [選填] :須要對該路徑擁有讀寫權限;爲空則使用默認路徑;xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler### 執行器日誌文件保存天數 [選填] : 過時日誌自動清理, 限制值大於等於3時生效; 不然, 如-1, 關閉自動清理功能;xxl.job.executor.logretentiondays=30
其中指定了上一步部署的調度中心的地址和執行器的相關參數。
而後在 config 包下建立 XxlJobConfiguration 類,會從配置文件中讀取到對應的參數,接着申明一個 xxlJobExecutor 方法,返回的是一個 XxlJobSpringExecutor,這個方法主要是如何初始化並建立一個 XxlJobSpringExecutor。
@Configurationpublic class XxlJobConfiguration { private Logger logger = LoggerFactory.getLogger(XxlJobConfiguration.class); @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.appname}") private String appname; @Value("${xxl.job.executor.address}") private String address; @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.executor.logretentiondays}") private int logRetentionDays; @Bean public XxlJobSpringExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> xxl-job config init."); // registry jobhandler XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler()); // init executor XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }
接下來就能夠建立任務了。
在這裏主要演示下 Bean 模式的任務,能夠基於類和方法進行開發,下面先介紹基於類的開發的任務。
首先建立一個類 BeanClassJobHandler,繼承 IJobHandler 實現 execute 方法,而後經過 XxlJobLogger.log 來打印日誌。
@Componentpublic class BeanClassJobHandler extends IJobHandler { @Override public ReturnT<String> execute(String param) throws Exception { XxlJobLogger.log("bean class jobhandler running..."); return ReturnT.SUCCESS; } }
基於類開發的任務須要手動註冊到執行器工廠,具體代碼以下所示:
XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler());
到此一個任務就開發完成了,下面介紹下基於方法的開發方式:
基於方法開發的任務比較簡單,編寫一個方法,並添加 @XxlJob 註解,會自動掃描該任務並注入到執行器容器。
@Componentpublic class BeanMethodJobHandler { @XxlJob("beanMethodJobHandler") public ReturnT<String> beanMethodJobHandler(String param) throws Exception { XxlJobLogger.log("bean method jobhandler running..."); return ReturnT.SUCCESS; } }
至此,執行器項目就開發完成了,啓動項目,在執行器管理頁面添加該執行器。
新增執行器
執行器添加完成後,須要在任務管理界面添加咱們剛纔開發的兩個任務,下面以 BEAN 模式方法任務爲例:
新增任務
點擊保存後,一個定時任務就完成了,是否是很簡單呢?
下面啓動任務來查看下執行結果,在這裏點擊「執行一次」,而後查詢執行日誌,結果以下圖:
執行日誌
能夠看到咱們的任務已經成功執行了,至此,Spring Boot 集成 XXL-JOB 任務調度平臺就完成了。
Spring Boot 與 XXL-JOB 的集成是否是很簡單呢?在這裏只是簡單地入門,想要了解更多能夠看下官方文檔:https://www.xuxueli.com/xxl-job。
尚未使用過的能夠經過本文快速上手,來實操起來吧!