【Java分享客棧】我為什么極力推薦XXL-JOB作為中小廠的分布式任務調度平台



前言

  大家好,我是福隆苑居士,今天給大家聊聊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的使用非常簡單,中小廠甚至不需要集群都是夠用的,這個調度平台哪怕掛掉了,重啟后依然能繼續執行,基本不影響原有業務邏輯,我呆過的這三個公司都是單機部署,線上也沒出現過任何問題,這也是我極力推薦給大家的原因,好學好用,不就是懶人必備么。


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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM