前言
大家好,我是福隆苑居士,今天給大家聊聊XXL-JOB的使用。
XXL-JOB是本人呆過的三家公司都使用到的分散式任務排程平臺,前兩家都是服務於傳統行業(某大型移動基地和某大型電網),現在這家是服務於網際網路行業(和騰訊阿里都有戰略合作),從1.9.x版本使用到現在的2.3.0版本,我認為XXL-JOB的使用方式越來越簡單且高效,剛發版時的BUG也修復了很多,並且跟上了這些年技術發展的節奏,可以預見會繼續被更多中小企業所親睞。
推薦原因
1)、經過幾年的發展,受眾多,中小企業尤其喜歡;
2)、持續更新迭代,修復了很多BUG,2.0版本開始引入了新的特性,耦合性降低;
3)、搭建相當簡單,幾乎是傻瓜式,開箱即用,這也是我最喜歡的原因;
4)、原始碼有很多學習的地方,雖然剛開始有被一些資深程式設計師詬病,但經過大量線上環境洗禮,已經非常穩定,個人以前有讀過原始碼,幾乎都是java最基礎的開發方式,樸實無華到你以為自己穿越到十年前,但換成自己又寫不出來,就是這種奇妙的感覺。
安裝方法
這裡我以xxl-job最新版2.3.0為例講解
官方文件:https://www.xuxueli.com/xxl-job/
1、下載
原始碼倉庫地址
原始碼倉庫地址 | Release Download |
---|---|
https://github.com/xuxueli/xxl-job | Download |
http://gitee.com/xuxueli0323/xxl-job | Download |
中央倉庫地址
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新穩定版本}</version>
</dependency>
友情提示:個人推薦使用原始碼安裝方式,然後打jar包部署,因為xxljob本身使用了springboot框架,可以和其他專案一起釋出到k8s,且後期更便於維護。
2、安裝
xxljob主要分為排程中心和執行器,簡單來講,排程中心就是後臺管理,執行器就是執行定時任務的,就這麼理解就行,沒那麼高大上。
1)、執行sql
在db目錄下,放到MySQL中直接執行即可。
2)、排程中心
排程中心就是xxl-job-admin,開啟application.properties,修改資料來源中的地址和賬號密碼即可。
然後直接啟動專案就行,真實環境中就是打jar包釋出執行。
啟動後,訪問:http://localhost:8080/xxl-job-admin
(該地址後面要裝的執行器將會使用到,作為回撥地址。)
3)、執行器
執行器就是xxl-job-executor-samples工程裡面的專案,我們選擇第二個springboot專案即可,當然,你也可以單獨把這個專案摘取出來,我反正每次不去管它,沒啥影響。
開啟application.properties,需要修改的也就是排程中心的地址,因為執行器要註冊到排程中心才能執行任務,其他的都是執行器的選填項,一般沒必要不改就行。
同樣的,檢查完配置後啟動這個springboot專案即可,也可以打成jar包釋出。
啟動後,一般過一會兒就會註冊到排程中心,開啟排程中心後臺的執行器管理就能發現已經連上了。
至此,xxl-job實際上就搭建完成了,可以發現,作者從一開始就是想著開箱即用,所以非常簡單。
最佳使用方法
這裡我專門說下,我從在廣州工作經歷的兩家公司到現在的網際網路公司,都用了xxl-job,前面的公司分別用到了兩種排程方式,直到目前的公司,使用了新版開始才用到了第三種方式,也是我認為對程式設計師最友好的方式。
這種方式叫做原生內建Bean模式任務,在官網有一個小小的位置講到了,後面會貼給大家看。
1)、編寫測試方法
這裡我們編寫兩個簡單的獲取使用者資訊介面(GET方式)和新增訂單介面(POST方式)
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* <p>
* 測試控制器
* </p>
*
* @author 福隆苑居士,公眾號:【Java分享客棧】
* @since 2022-02-23 15:46
*/
@RestController
@RequestMapping("/api")
public class TestController {
private static final Logger log = LoggerFactory.getLogger(TestController.class);
/**
* 獲取使用者資訊
*/
@GetMapping("/getUser")
public String getUser(@RequestParam(value = "userId") String userId,
@RequestParam(value = "param") String param) {
log.debug("[XXLJOB]>>>> 獲取使用者資訊....userId={}, param={}", userId, param);
return "成功";
}
/**
* 新增訂單資訊
*/
@PostMapping(value = "/saveOrder", produces = MediaType.APPLICATION_JSON_VALUE)
public String saveOrder(@RequestBody(required = false) Map<String, String> reqMap) {
log.debug("[XXLJOB]>>>> 新增訂單資訊....reqMap={}", reqMap);
return "成功";
}
}
2)、GET方式
開啟任務管理,點選新增,然後按照圖示配置即可,這裡特別說明,JobHandler一欄必須填寫httpJobHandler,這是xxl-job內建的handler,不能寫錯名稱。
傳參就在url後面寫即可
3)、POST方式
和上面一樣寫法,唯一不同就是傳參這裡,post方式的data中引數物件傳json格式,不能換行,要連著寫,否則會報錯。
4)、效果
啟動測試專案兩個介面,然後將排程中心我們新建的兩個定時任務開啟,看10秒和15秒後是不是分別開始執行兩個測試介面。
可以看到,兩個介面都會根據cron表示式配置的時間開始執行排程任務,說明我們整個排程平臺搭建是成功的。
說明
官網文件其實寫的很清晰,我這裡貼出幾種排程方式給大家看,裡面最常用的其實是BEAN模式類形式,這種需要人工開發Job類,然後排程中心新建任務指向這個JobHandler,本人前兩個公司都是這麼用的,當時就總覺得不太習慣。
紅框中的就是本文講到的BEAN方法形式中的內建模式,也就是直接調http介面就行,不需要額外編寫Job類,這種其實最符合高內聚低耦合的原則,專案中排程任務越多越能發現這種方式維護起來有多清爽。
這裡貼出來資料庫表中的內容,可以發現xxl_job_info表存的就是我們新建的定時任務資訊。
然後xxl_job_log表存的就是我們執行排程任務產生的日誌,可以發現一會兒就幾十條了,那麼會不會線上上環境把日誌表撐爆呢,看下面一張圖。
前面講過的排程中心和執行器的application.properties檔案中,最後有一行都有配置日誌儲存天數的,預設是30天,可以根據專案規模進行修改。
實際上,用了好幾年,我認為這個日誌作用不大,不需要保留太久,專案規模不大的話就預設也行。
總結
xxl-job的使用非常簡單,中小廠甚至不需要叢集都是夠用的,這個排程平臺哪怕掛掉了,重啟後依然能繼續執行,基本不影響原有業務邏輯,我呆過的這三個公司都是單機部署,線上也沒出現過任何問題,這也是我極力推薦給大家的原因,好學好用,不就是懶人必備麼。
如果大家覺得有一滴滴幫助的話,就請一鍵……伸出芊芊玉手點個推薦推薦推薦吧~~