XXL-JOB任務調度


日常開發中難免會碰到需要開啟定時任務處理業務。這時我們第一時間想到的是Spring的Task,但是很不方便,這里可以列出幾點:

  1.一旦需要更改定時任務時間,我們就要打開IDE修改cron表達式;

  2.在特殊的情況下代碼報錯了,我們就要打開Log查看是什么導致的問題;

  3.需要很多定時任務去處理業務就要新建多個,突然不想執行這個任務了,我們就要再打開IDE注釋那些代碼。

 

                  就特別不好管理。

 

可能又有人要說了:

  1.我可以用Redis進行動態修改cron表達式;-------- 看下面代碼!!!

  2.我寫個Aop,只要出現異常了我就記錄相關信息;-------- 牛掰!Aop固然好,但是你覺得真的方便了嗎?

  3.······我就是不閑麻煩,咋地。-------- 打擾了!!!

 

package cn.chenghao.config;

import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

import javax.annotation.PostConstruct;

/**
 * 自定義定時任務
 *
 * @Author chenghao
 * @Date 2020/4/14 11:56
 **/
@Configuration
@EnableScheduling
@AllArgsConstructor
public class CompleteScheduleConfig implements SchedulingConfigurer {

    /**
     * StringRedis模板
     */
    private final StringRedisTemplate stringRedisTemplate;

    /**
     * 初始化
     */
    @PostConstruct
    private void init() {
        // redis中不存在則創建
        stringRedisTemplate.opsForValue().setIfAbsent("cron", "0/3 * * * * ?");
    }

    /**
     * 配置任務
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        // 給定cron表達式,觸發Runnable任務
        scheduledTaskRegistrar.addTriggerTask(
                () -> {
                    System.out.println("執行定時任務中.......");
                },
                triggerContext -> {
                    // 獲取cron表達式
                    String cron = stringRedisTemplate.opsForValue().get("cron");
                    // 返回執行周期
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                });
    }
}

!(真的是太方便了) 

      

 

----------------------------------好,廢話不再多說----------------------------------

 

XXL-JOB地址:

  Gitee:https://gitee.com/xuxueli0323/xxl-job

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

  XXL社區:https://www.xuxueli.com/xxl-job/

 

概述:XXL-JOB是一個分布式任務調度平台,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼並接入多家公司線上產品線,開箱即用。

 

首先將項目clone下來后,再打開社區文檔,根據文檔引導先將 doc/db/tables_xxl_job.sql 腳本在自己的數據庫中執行

確認無誤后,再繼續看文檔:

 

 XXL-JOB分為三個大模塊:調度中心、公共依賴、執行器

 

首先我們根據文檔引導,配置調度中心

/xxl-job/xxl-job-admin/src/main/resources/application.properties

 

想想還是截個圖:

 

相應配置完成后,直接運行admin模塊,瀏覽器輸入:http://localhost:8080/xxl-job-admin     默認登錄賬號 admin/123456

 

剛進去這首頁我還是很吃驚的!!!

 

 

調度器配置、運行都成功了現在我們就要新建個任務看看效果了,在這之前我們還要配置執行器,也就是執行任務的容器

 

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

 

想來想去我又截了:

 

配置好對應調度中心的信息后,我們在運行執行器

 

 

 

運行沒問題后,我們來新建個任務試試水:

 

 

 

我們就先用GLUE模式試試吧

 

 

 

 

保存完后,直接點擊啟動!!!

 

看控制台:

 

看日志:

 

任何操作一目了然!!!

 

現在我們知道了XXL-JOB的作用了,就在想怎么對接到自己的項目運行,其實想想就是將公共依賴模塊移出來

 

<!-- xxl-job 任務調度 -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.2.0</version>
        </dependency>

 

隨后根據clone下來項目中的springboot版本的執行器復制 application.properties 

 

 

package cn.running.taskdispatchdemo.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 執行器配置
 *
 * @author chenghao
 * @createTime 2020/5/21
 */
@Log
@Configuration
@ComponentScan(basePackages = "cn.running.taskdispatchdemo.handler")
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")
    public XxlJobSpringExecutor xxlJobSpringExecutor() {
        log.info("》》》》》 XXL-JOB 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;
    }

}

 

 

基本配置完成后,現在調度中心新增執行器,再啟動我們新建的執行器保存后,稍微等待一點時間,就自動注冊上去了!!!

 

 

在調度中心頁面新增個任務:

 

 

缺少JobHandler 需要我們去新建

package cn.running.taskdispatchdemo.handler;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 任務處理
 *
 * @author chenghao
 * @createTime 2020/5/21
 */
@Component("myHandler")
public class MyHandler {

    @XxlJob("demoJobHandler")
    public ReturnT<String> execute(String s) {
        System.out.println("任務執行成功,執行參數:" + s + "當前時間是:" + LocalDateTime.now());
        return ReturnT.SUCCESS;
    }
}

 

 

這樣就ok了,重啟執行器就行了。再啟動任務

 

看控制台:

 

看日志:

 

至此,我們再來看看首頁的樣子

 


免責聲明!

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



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