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/ 賬號: