【Java分享客棧】我為什麼極力推薦XXL-JOB作為中小廠的分散式任務排程平臺

福隆苑居士發表於2022-02-24

前言

  大家好,我是福隆苑居士,今天給大家聊聊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中直接執行即可。
111.png
222.png


2)、排程中心

排程中心就是xxl-job-admin,開啟application.properties,修改資料來源中的地址和賬號密碼即可。
333.png

然後直接啟動專案就行,真實環境中就是打jar包釋出執行。

啟動後,訪問:http://localhost:8080/xxl-job-admin 

(該地址後面要裝的執行器將會使用到,作為回撥地址。)

444.png


3)、執行器

  執行器就是xxl-job-executor-samples工程裡面的專案,我們選擇第二個springboot專案即可,當然,你也可以單獨把這個專案摘取出來,我反正每次不去管它,沒啥影響。

  開啟application.properties,需要修改的也就是排程中心的地址,因為執行器要註冊到排程中心才能執行任務,其他的都是執行器的選填項,一般沒必要不改就行。

555.png

同樣的,檢查完配置後啟動這個springboot專案即可,也可以打成jar包釋出。

啟動後,一般過一會兒就會註冊到排程中心,開啟排程中心後臺的執行器管理就能發現已經連上了。

666.png

至此,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後面寫即可
777.png


3)、POST方式

和上面一樣寫法,唯一不同就是傳參這裡,post方式的data中引數物件傳json格式,不能換行,要連著寫,否則會報錯。
888.png


4)、效果

啟動測試專案兩個介面,然後將排程中心我們新建的兩個定時任務開啟,看10秒和15秒後是不是分別開始執行兩個測試介面。

999.png

可以看到,兩個介面都會根據cron表示式配置的時間開始執行排程任務,說明我們整個排程平臺搭建是成功的。


說明

  官網文件其實寫的很清晰,我這裡貼出幾種排程方式給大家看,裡面最常用的其實是BEAN模式類形式,這種需要人工開發Job類,然後排程中心新建任務指向這個JobHandler,本人前兩個公司都是這麼用的,當時就總覺得不太習慣。


  紅框中的就是本文講到的BEAN方法形式中的內建模式,也就是直接調http介面就行,不需要額外編寫Job類,這種其實最符合高內聚低耦合的原則,專案中排程任務越多越能發現這種方式維護起來有多清爽。
1010.png

1111.png

這裡貼出來資料庫表中的內容,可以發現xxl_job_info表存的就是我們新建的定時任務資訊。

1212.png

然後xxl_job_log表存的就是我們執行排程任務產生的日誌,可以發現一會兒就幾十條了,那麼會不會線上上環境把日誌表撐爆呢,看下面一張圖。

1313.png

前面講過的排程中心和執行器的application.properties檔案中,最後有一行都有配置日誌儲存天數的,預設是30天,可以根據專案規模進行修改。

實際上,用了好幾年,我認為這個日誌作用不大,不需要保留太久,專案規模不大的話就預設也行。

1414.png

1515.png


總結

  xxl-job的使用非常簡單,中小廠甚至不需要叢集都是夠用的,這個排程平臺哪怕掛掉了,重啟後依然能繼續執行,基本不影響原有業務邏輯,我呆過的這三個公司都是單機部署,線上也沒出現過任何問題,這也是我極力推薦給大家的原因,好學好用,不就是懶人必備麼。


如果大家覺得有一滴滴幫助的話,就請一鍵……伸出芊芊玉手點個推薦推薦推薦吧~~


相關文章