1. 程式人生 > 其它 >springboot與xxl-job,附上與docker-compose整合

springboot與xxl-job,附上與docker-compose整合

springboot與xxl-job整合,附上與docker-compose啟動

 

 

前言

因為公司內部專案需要經常匯出一些報表發給領導,以及很多時候需要定時傳送訊息,所以需要一個定時任務框架,最好它能夠實時修改生效以及頁面維護,我們從中選擇了XXL-JOBhttps://www.xuxueli.com/xxl-job/

 

選型

 

目前市面上常見的有quartz,我的上家公司就是用quartz, 底層以“搶佔式”獲取DB鎖並由搶佔成功節點負責執行任務, 任務多的情況下容易導致經常死鎖,非常麻煩,而且沒有頁面可以維護,檢視任務。

第二種就是Elastic-Job,我的上上家公司就是用這套,因為我們當時是用dubbo+zookeeper的框架,所以也很貼切,加上hippo框架可以實現介面維護, 但是我們公司這個專案還沒有架構到微服務所以也不準備引入ZK。

XXL-JOB就比較簡單使用了,也沒有這麼高的入侵性,特別是現在還支援GLUE任務,實現線上編輯生效,還能頁面維護。

 

XXL-JOB模式

XXL-JOB 分為 排程中心(XXL-JOB-Admin) 以及執行器(我們自己的專案)排程中心就是類似我們微服務的註冊中心, 是一個服務發現與治理作用。 而我們的執行器,就是我們的消費者和生產者。

 

與springboot整合

排程中心搭建

在官網找到下載原始碼地址:

https://www.xuxueli.com/xxl-job/#1.5%20%E4%B8%8B%E8%BD%BD

有github和gitee選擇,我選擇從github下載最新的:

https://github.com/xuxueli/xxl-job

 

 

 

 

 

開啟專案, 找xxl-job-admin的resources對應地址:

xxl-job201\xxl-job-admin\src\main\resources\application.properties

 

這裡我是修改了埠以及資料庫賬號密碼

 

 

 

之後再啟動:

 

 

成功了:

 

 

開啟頁面 你的ip記得換:

http://192.168.110.195:7999/xxl-job-admin/

 

 

那麼排程中心搭建就結束了。

 

執行器(專案)整合

小編之前無論怎麼啟動除錯 都無法註冊上服務, 最後是更換為最新的2.3.0版本才解決的這個問題,如果遇到無法註冊上服務的,也可以試著使用最新版本。

 

先下載依賴:

<dependency>
  <groupId>com.xuxueli</groupId>
  <artifactId>xxl-job-core</artifactId>
  <version>2.3.0</version>
</dependency>

 

編寫配置類:

 

 

package com.XXXX.core.xxlJob;


import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
* @author rick
* @create 2022/3/7 10:19
*/
@Slf4j
@Component
public class XxlJobConfig {

  @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() {
      log.info(">>>>>>>>>>> xxl-job config init.");
      XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
      xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
      xxlJobSpringExecutor.setIp(ip);
      xxlJobSpringExecutor.setAppname(appname);
      xxlJobSpringExecutor.setPort(port);
      xxlJobSpringExecutor.setAccessToken(accessToken);
      xxlJobSpringExecutor.setLogPath(logPath);
      xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

      return xxlJobSpringExecutor;
  }

  /**
    * 針對多網絡卡、容器內部署等情況,可藉助 "spring-cloud-commons" 提供的 "InetUtils" 元件靈活定製註冊IP;
    *
    *     1、引入依賴:
    *         <dependency>
    *             <groupId>org.springframework.cloud</groupId>
    *             <artifactId>spring-cloud-commons</artifactId>
    *             <version>${version}</version>
    *         </dependency>
    *
    *     2、配置檔案,或者容器啟動變數
    *         spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
    *
    *     3、獲取IP
    *         String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
    */

}

 

 

在application.yml 中加入對應配置:

1、這裡的addresses必須加上埠號,如果你沒加上埠號,除非你在nginx中配置了80埠且對映7999服務,否則無法註冊到排程中心。

2、appname請填寫好,否則無法註冊到排程中心。

# xxl-job配置
xxl:
job:
  admin:
    # 排程中心部署跟地址 [選填]:如排程中心叢集部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回撥";為空則關閉自動註冊;
    addresses: http://192.168.110.195:7999/xxl-job-admin
  executor:
    # 執行器註冊 [選填]:優先使用該配置作為註冊地址,為空時使用內嵌服務 ”IP:PORT“ 作為註冊地址。從而更靈活的支援容器型別執行器動態IP和動態對映埠問題。
    address:
    # 執行器AppName [選填]:執行器心跳註冊分組依據;為空則關閉自動註冊
    appname: appname
    # 執行器IP [選填]:預設為空表示自動獲取IP,多網絡卡時可手動設定指定IP,該IP不會繫結Host僅作為通訊實用;地址資訊用於 "執行器註冊" 和 "排程中心請求並觸發任務";
    ip:
    # 執行器埠號 [選填]:小於等於0則自動獲取;預設埠為9999,單機部署多個執行器時,注意要配置不同執行器埠;
    port: 9999
    # 執行器執行日誌檔案儲存磁碟路徑 [選填] :需要對該路徑擁有讀寫許可權;為空則使用預設路徑;
    logpath:
    # 執行器日誌檔案儲存天數 [選填] : 過期日誌自動清理, 限制值大於等於3時生效; 否則, 如-1, 關閉自動清理功能;
    logretentiondays: 15
  # 執行器通訊TOKEN [選填]:非空時啟用;
  accessToken:

 

配置類就寫完了.

 

新增一個任務service(我這裡用的是**GLUE**模式,寫好程式碼直接複製到xxl-job中**IDE GLUE**進行儲存,程式碼實時生效,可執行):

 

 如果你要用Bean模式,那麼就需要把bean註冊到spring中,然後對應的beanName需要@XxlJob(value = "beanName")

 

 

到這裡,你的執行器配置就寫完了。

 

 

接下來去排程中心填寫你的執行器:

 

 

 

 

等待一下,會發現服務註冊上了。

 

 

然後就可以在任務管理 新增自己的任務吧~~~~

 

 

 

與Docker-Compose整合

 

XXL-JOB 與Docker-Compose原文連線:

https://www.http3w.com/archives/445

 

下載映象

docker pull xuxueli/xxl-job-admin:2.3.0

 

初始化對應版本資料庫(xxl_job)

https://github.com/xuxueli/xxl-job/blob/2.3.0/doc/db/tables_xxl_job.sql

因為我的版本是2.3.0,所以預設開啟本sql指令碼,其他版本可自行選擇

建立docker-comopose.yml

這裡的ports 我改成了我的內部7999埠(也是和原文不同的地方)。

version: '3'
services:
xxl-job-admin:
  image: xuxueli/xxl-job-admin:2.3.0
  restart: always
  container_name: xxl-job-admin
  environment:
    PARAMS: '--spring.datasource.url=jdbc:mysql://IP:PORT/xxl_job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.username=root --spring.datasource.password=123456'
  ports:
    - 80:7999
  volumes:
    - ./data/applogs:/data/applogs

啟動後

訪問地址為:IP/xxl-job-admin/ 賬號: admin 密碼: 123456