SpringBoot整合Xxl-job實現定時任務的全過程

前言

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

如果是單機並且定時任務不多的情況,可以選擇Timer註解@Scheduled或者Cron工具類等方式來實現,但是這有個缺點,那就是定時任務會寫死在代碼中,一旦啟動,就不能暫停或者修改。如果修改的話,整個還項目要重新編譯,這屬實非常的麻煩。

​ 本篇文章將會介紹如何通過xxl-job來實現任務的調度

一、部署調度中心

1、項目下載

下面是調度中心代碼的gitee地址,可以colon到本地

http://gitee.com/xuxueli0323/xxl-job

2、初始化數據

在下載好的項目中的doc/db目錄下有一個tables_xxl_job.sql文件,先放到自己的數據庫中執行,其實就是初始化好調度中心需要的表結構和數據

3、修改properties配置文件

用IDE打開clone好的項目,然後修改xxl-job-admin模塊下的properties配置文件,隻需要將連接數據庫的url、username、password修改成你自己的就可以。修改好之後就可以啟動xxl-job-admin調度中心瞭。然後打開http://localhost:8080/xxl-job-admin/就可以看到控制面板:

請添加圖片描述

二、部署SpringBoot項目

1、引入依賴

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

2、創建配置類

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @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
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.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;
    }
}

3、修改配置文件

xxl:
  job:
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin #部署的調度中心的url
    executor:
      appname: xxl-job-volunteer-executor #執行器的名字
      ip:
      port: 9999 #調度中心調用執行器時使用的端口
      logpath: /data/apploggs/xxl-job/jobhandler #日志路徑
      logretentiondays: 30 #日志保留天數
    accessToken:

4、創建執行器

@Component
public class XxlJobSample {

    // myDemoJob是任務的名字,也是Spring中bean的名字
    @XxlJob("myDemoJob")
    public ReturnT<String> myDemoJob(String value) {
        System.out.println("myDemoJob:定時任務觸發:" + value);
        return ReturnT.SUCCESS;
    }
    
}

5、啟動SpringBoot項目

啟動成功後會看到下面兩行日志信息, 可以看到成功連接到瞭調度中心然後註冊瞭將要被調度任務

 >>>>>>>>>>> xxl-job register jobhandler success, name:myDemoJob, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@1f94dd63[class com.volunteer.component.XxlJobSample#myDemoJob]
 
 >>>>>>>>>>> xxl-job remoting server start success, nettype = class com.xxl.job.core.server.EmbedServer, port = 9999

三、通過調度中心進行任務調度

1、添加執行器

請添加圖片描述

輸入配置文件中配置的appName,名稱可以隨意

請添加圖片描述

2、添加任務

新增調度任務

請添加圖片描述

請添加圖片描述

查看調度任務

請添加圖片描述

3、任務調度中心發起任務調度

請添加圖片描述

在SpringBoot項目中可以看到控制臺輸出如下信息:

2022-01-16 11:54:05.039  INFO 7836 --- [Pool-1148366645] c.xxl.job.core.executor.XxlJobExecutor   : >>>>>>>>>>> xxl-job regist JobThread success, jobId:7, handler:com.xxl.job.core.handler.impl.MethodJobHandler@1f94dd63[class com.volunteer.component.XxlJobSample#myDemoJob]
myDemoJob:定時任務觸發:testParam
2022-01-16 11:55:38.059  INFO 7836 --- [      Thread-22] com.xxl.job.core.thread.JobThread        : >>>>>>>>>>> xxl-job JobThread stoped, hashCode:Thread[Thread-22,10,main]

四、小結

至此,SpringBoot整合Xxl-job就完成瞭,剛才的示例代碼其實對於原來的項目還是有一定的侵入性的,上面僅僅演示瞭BEAN運行模式,說白瞭就是調用加瞭@XxlJob的方法。其實在創建任務的時候還可以嘗試使用GLUE(Java)這一運行模式,這種方式其實就是執行你輸入的Java代碼,這種方式可以不用在原有的項目之上新增依賴或者配置,對於定時任務,隻需要編寫一個接口用於觸發,然後GLUE(Java)任務定時的去請求暴露的接口即可

下面是代碼片段:

public class DemoGlueJobHandler extends IJobHandler {

	@Override
	public void execute() throws Exception {
		XxlJobHelper.log("定時任務執行瞭一次");
        HttpRequest.post("http://localhost:8088/oos/test")
                  .header(Header.USER_AGENT, "xxl-job")//頭信息,多個頭信息多次調用此方法即可
                  .timeout(20000)//超時,毫秒
                  .execute();
	}

}

上面的代碼其實會在執行器中進行執行,可以實現在Test裡面跑一下,沒有問題後再貼過來(還要註意復制import等信息)

以上就是今天的全部內容瞭,想瞭解更多,可以閱讀官方文檔

總結

到此這篇關於SpringBoot整合Xxl-job實現定時任務的文章就介紹到這瞭,更多相關SpringBoot整合Xxl-job實現定時任務內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: