在spring boot中3分鐘上手分散式任務排程系統xxl-job
xxl-job在鼎鼎大名的 quartz 任務排程系統上進行了二次封裝,變得更好用了 專案地址: github.com/xuxueli/xxl…
雖然官方文件也很全,很詳細,需要多花些時間上手,以下是我根據官方文件整理出的快速上手步驟,可以減少上手需要花費的時間和一些生產使用需要注意的點
在mysql中執行以下sqltables_xxl_job.sql
這個sql建立xxl-job和排程任務的表 記下mysql的地址,使用者名稱和密碼
使用docker一鍵啟動排程中心
docker run -d --rm \ -e PARAMS="--spring.datasource.url=jdbc:mysql://你的mysql資料庫ip:3306/xxl-job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=你的mysql資料庫使用者名稱 --spring.datasource.password=你的mysql資料庫密碼" \ -p 8680:8080 \ --name xxl-job-admin xuxueli/xxl-job-admin:2.0.2 複製程式碼
在瀏覽器中使用預設使用者名稱和密碼 admin 123456 登陸檢視效果

將一個spring boot專案變成一個xxl-job任務的執行器
在現有專案的pom.xml加上xxl-job core依賴
<!-- xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.0.2</version> </dependency> 複製程式碼
在現有的配置檔案src/main/resources/application.properties檔案中新增xxl-job排程中心的配置
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" xxl.job.admin.addresses=http://127.0.0.1:8680/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample xxl.job.executor.ip= xxl.job.executor.port=9999 ### xxl-job, access token xxl.job.accessToken= ### xxl-job log path xxl.job.executor.logpath=logs/xxl-job/jobhandler ### xxl-job log retention days xxl.job.executor.logretentiondays=-1 複製程式碼
然後在spring boot中把xxl job註冊成服務,參考:XxlJobConfig.java 核心程式碼如下:
@Bean(initMethod = "start", destroyMethod = "destroy") public XxlJobSpringExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> 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; } 複製程式碼
啟動專案,在排程中心檢視效果

可以看到我們的執行器上線了
編寫任務
用到spring boot了,一般都會在任務中呼叫spring boot專案的資源,比如 jpa, service, util等
在spring boot專案中建立一個測試任務,比如 TestJobHandler.java 核心程式碼如下
@JobHandler(value="testJobHandler") @Component public class TestJobHandler extends IJobHandler { private final InService inService; @Autowired public TestJobHandler(InService inService) { this.inService = inService; } @Override public ReturnT<String> execute(String param) throws Exception { XxlJobLogger.log("XXL-JOB, Hello World."); for (int i = 0; i < 5; i++) { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } inService.xxl(); return SUCCESS; } } 複製程式碼
其中inService便是spring boot中的一個普通的service
執行任務
然後在排程中心建立任務執行我們剛才建立的任務

點選啟動任務,在任務執行程式碼中斷個點檢視效果

任務觸發成功!
同時可以在排程中心看到執行的記錄和日誌

一些注意的點
排程中心的JobHandler必須和程式碼裡的JobHandler的值一致才能匹配到執行的任務

生產環節使用要保證任務執行客戶端的高可用,開啟高可用參考:執行器叢集
排程中心也需要高可用,參考:排程中心叢集
一般微服務都在容器裡部署,容器部署需要特別注意ip地址,參考:XxlJobConfig.java 的說明
