xxl-job搭建、部署、SpringBoot集成xxl-job


一、搭建xxl-job

1、下載xxl-job代碼

  碼雲地址:https://gitee.com/xuxueli0323/xxl-job

  gitHub地址:https://github.com/xuxueli/xxl-job

2、執行SQL

  在數據庫執行   \xxl-job\doc\db\tables_xxl_job.sql

  

 

 

 3、導入idea

  導入已存在的模塊:File--New--Module from Existing Sources...

  選擇pom文件,直接導入

 

 

 

 

 

 4、修改配置文件

  修改配置文件:xxl-job\xxl-job-admin\src\main\resources\application.properties

  調整數據庫連接、控制台用戶名密碼等內容

  此處特別說明一點,郵箱配置的password並不是郵箱密碼,而是郵箱的授權碼(授權碼獲取步驟自己百度),如果配置成郵箱密碼,當定時任務異常需要發郵件時,會出現郵件發送535錯誤。

### 調度中心項目的端口號以及訪問路徑
server.port=8081
server.context-path=/xxl-job-admin

### 配置靜態文件的前綴
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/

### 配置模板文件
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########

### 配置mybatis的mapper文件地址
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml

### 配置數據庫的地址
spring.datasource.url=jdbc:mysql://***:3306/xxl_job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=30
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=30000

### 配置報警郵箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

### 調度中心通訊TOKEN,非空時啟用
xxl.job.accessToken=

### 調度中心國際化設置,默認為中文版本,值設置為“en”時切換為英文版本 xxl-job, i18n (default empty as chinese, "en" as english)
xxl.job.i18n=

### 7、管理界面的登錄用戶名密碼
xxl.job.login.username=admin
xxl.job.login.password=123456

 

  5、啟動項目

運行main函數,訪問  http://localhost:8081/xxl-job-admin/toLogin  ,輸入用戶名密碼(在application.properties中配置的),登陸,到此為止,xxl-job項目部署成功。

 

 

 

 

 

 二、項目中使用xxl-job

 1、導入xxl-job依賴

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

 2、配置文件中(application.yml)配置xxl-job配置

  其中appname為項目名

xxl:
job:
accessToken:
executor:
appname: demo
ip:
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: -1
port: 9999
admin:
addresses: http://localhost:8081/xxl-job-admin

 3、添加xxl-job配置類

  直接復制,無需更改。

package com.example.demo.config;

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.context.annotation.Configuration;

@Slf4j
@Configuration
public class XXlJobConfig {
    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.executor.appname}")
    private String appName;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean(initMethod = "start", destroyMethod = "destroy")
    public XxlJobSpringExecutor xxlJobExecutor() {
        log.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppName(appName);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }
}

 4、定時任務控制器

  (1)定時任務實現類

  此處模擬一個最簡單的打印輸出

package com.example.demo.service;

import org.springframework.stereotype.Service;

@Service
public class DemoJobService {
    public void demoTest(String s1){
        System.out.println("==============" + s1);
    }
}

  (2)handler

  此處注解非常重要。

package com.example.demo.handler;

import com.example.demo.service.DemoJobService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;


@JobHandler(value = "demoHandler")
@Component
@Slf4j
@RequiredArgsConstructor
public class DemoHandler extends IJobHandler {

    private final DemoJobService demoJobService;

    @Override
    public ReturnT<String> execute(String s1) throws Exception {
        XxlJobLogger.log("xxl-job測試任務開始執行。【args: {}】", s1);
        try {
            demoJobService.demoTest(s1);
            XxlJobLogger.log("xxl-job測試任務執行結束。");
            return SUCCESS;
        } catch (Exception e) {
            XxlJobLogger.log("xxl-job測試任務執行出錯!", e);
            return FAIL;
        }
    }
}

  至此,使用xxl-job的項目配置處理完畢。

三、定時任務執行配置

  1、執行器配置

  登陸xxl-job控制台后,點擊執行器管理------新增執行器。

  執行器中內容:

    AppName:在使用xxl-job項目中配置的appname(見第二步中的第2點)

    名稱:隨便填寫(由於可能會多個項目同時使用xxl-job,因此建議一個項目一個執行器,且執行器名稱直接可以看出是哪個項目)

    排序:1

    注冊方式:自動注入

    機器地址:空(xxl-job會自動掃描識別地址)

 

 

  2、定時任務配置

  任務管理---新增

  任務中內容:

    執行器:選擇指定的執行器

    任務描述:定時任務的名稱

    路由策略:可以根據自己的需要選擇(一般選擇輪詢)

      FIRST(第一個):固定選擇第一個機器

      LAST(最后一個):固定選擇最后一個機器          

      ROUND(輪詢):輪詢執行

      RANDOM(隨機):隨機選擇在線的機器;

      CONSISTENT_HASH(一致性HASH):每個任務按照Hash算法固定選擇某一台機器,且所有任務均勻散列在不同機器上。

      LEAST_FREQUENTLY_USED(最不經常使用):使用頻率最低的機器優先被選舉;

      LEAST_RECENTLY_USED(最近最久未使用):最久為使用的機器優先被選舉

      FAILOVER(故障轉移):按照順序依次進行心跳檢測,第一個心跳檢測成功的機器選定為目標執行器並發起調度;

      BUSYOVER(忙碌轉移):按照順序依次進行空閑檢測,第一個空閑檢測成功的機器選定為目標執行器並發起調度;

      SHARDING_BROADCAST(分片廣播):廣播觸發對應集群中所有機器執行一次任務,同時系統自動傳遞分片參數;可根據分片參數開發分片任務;

    Cron:定時任務執行時間(此處測試是每秒執行一次,所以配置的* * * * * ?)

    運行模式:可根據自己需要選擇(一般選擇BEGAN)

      BEAN模式:任務以JobHandler方式維護在執行器端;需要結合 "JobHandler" 屬性匹配執行器中任務;

      GLUE模式(Java):任務以源碼方式維護在調度中心;該模式的任務實際上是一段繼承自IJobHandler的Java類代碼並 "groovy" 源碼方式維護,它在執行器項目中運行,可使用@Resource/@Autowire注入執行器里中的其他服務;

      GLUE模式(Shell):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "shell" 腳本;

      GLUE模式(Python):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "python" 腳本;

      GLUE模式(PHP):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "php" 腳本;

      GLUE模式(NodeJS):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "nodejs" 腳本;

      GLUE模式(PowerShell):任務以源碼方式維護在調度中心;該模式的任務實際上是一段 "PowerShell" 腳本;

    jobHandler:定時任務中@JobHandler注解中的配置

    阻塞處理策略:根據自己需要選擇(一般選擇單機串行)

      單機串行(默認):調度請求進入單機執行器后,調度請求進入FIFO隊列並以串行方式運行;

      棄后續調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,本次請求將會被丟棄並標記為失敗;

      覆蓋之前調度:調度請求進入單機執行器后,發現執行器存在運行的調度任務,將會終止運行中的調度任務並清空隊列,然后運行本地調度任務;

    子任務ID:每個任務都擁有一個唯一的任務ID(任務ID可以從任務列表獲取),當本任務執行結束並且執行成功時,將會觸發子任務ID所對應的任務的一次主動調度。一般為空。

    任務超時時間:支持自定義任務超時時間,任務運行超時將會主動中斷任務

    失敗重試次數;支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;

    報警郵件:任務調度失敗時郵件通知的郵箱地址,支持配置多郵箱地址,配置多個郵箱地址時用逗號分隔;

    負責人:任務的負責人

    執行參數:任務執行所需的參數,多個參數時用逗號分隔,任務執行時將會把多個參數轉換成數組傳入;

 

 

  3、測試

  點擊操作,執行一次,然后查看日志,看是否執行成功

  

 

 

 

 

 

   此處顯示執行成功,然后可以在操作按鈕下正式啟動定時任務。

  開啟定時任務后,可見后台在持續執行(按照配置的一秒輸出一次)

 

 

   校驗失敗通知和重試次數:

  在實現類中添加代碼:int k = 10/0;

  查看執行日志,失敗了6次(原因是調度平台配置了失敗后重試5次)

  

 

 

   在看調度平台中配置的異常警告郵件,也是有6次告警。這里可以將異常拋出,並在告警郵件中展示。

 

 

 

四、在docker上部署xxl-job

  1、打包xxl-job-admin

  2、在服務器中創建xxl-job文件夾: mkdir /usr/data/xxl-job

  3、進入新創建的xxl-job文件夾,新建一個dockerfile文件,編輯文件

# Docker image for springboot file run
# VERSION 0.0.1
# Author: eangulee
# 基礎鏡像使用java
FROM java:8
# 作者
MAINTAINER lcl <liconglong@163.com>
# VOLUME 指定了臨時文件目錄為/tmp。
# 其效果是在主機 /var/lib/docker 目錄下創建了一個臨時文件,並鏈接到容器的/tmp
VOLUME /tmp
# 將jar包添加到容器中並更名為app.jar,此處的jar包名稱一定要與要部署的jar包名稱一致
ADD xxl-job-admin-2.1.1-SNAPSHOT.jar app.jar
# 運行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

  命令詳解:

    FROM:基礎鏡像名稱

    MAINTAINER:作者信息

    VOLUME:數據掛載

    ADD:項目的 jar 文件作為 “app.jar” 添加到容器的 ENTRYPOINT 執行項目 app.jar

    ENTRYPOINT:指定容器啟動時需要執行的命令(為了縮短 Tomcat 啟動時間,添加一個系統屬性指向 “/dev/./urandom” 作為 Entropy Source 如果是第一次打包,它會自動下載java 8的鏡像作為基礎鏡像,以后再制作鏡像的時候就不會再下載了) 

  4、將xxl-job-admin.jar上傳至xxl-job文件夾

 

   5、構建新的鏡像

  docker build -t xxl-job-admin .    (后面的.一定不要遺漏)

 

 

  6、使用xxl-job-admin鏡像啟動新容器

   docker run -d -p 8081:8081 xxl-job-admin

  -d:后台運行

  -p:端口映射

  7、驗證

  http://ip:8081/xxl-job-admin

 

   五、調整項目配置

  更改第二步第2點中的xxl-job地址

  六、按照第三步重新配置定時任務即可。


免責聲明!

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



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