HOME/Articles/

xxl-job定时任务

Article Outline

最近写代码发现了一个很好用的定时任务工具,xxljob,为了防止拖延症加上以后忘了怎么用,特此记录一下。

xxl-job定时任务

1、组成

xxljob可以简单的认为是由2部分组成的,调度中心和执行器

  • 调度中心:可以理解为管理节点,通过调度中心来管理和调用执行器来最终实现定时任务。
  • 执行器:真正的执行节点,通过接收调度中心的命令,最终实现定时任务的执行。

2、使用步骤

(1)、引入相关的依赖

首先访问 https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core,从中选择喜欢的版本,一般就选择用的最多的高版本就ok,添加到项目的pom.xml文件中。

(2)、配置调度中心

https://gitee.com/xuxueli0323/xxl-job.git,通过gitee可以获取到这个项目的代码文件,其中,`xxl-job-admin`为调度中心代码,这个调度中心代码已经实现了调度的全部功能,所以不需要修改,调度中心也是基于springboot项目进行搭建的,只需要到resources目录中,修改application.properties文件中的端口号,数据库地址,数据库连接密码,就ok了,然后将xxl-job-admin使用maven打包成jar文件,即可放到带有java环境的服务器中执行了。

(3)、数据库表

xxl-job需要一系列的数据库表,通过gitee下载的xxl-job项目中,doc目录\db目录中,提供了数据库相关的sql语句,只要连接数据库,执行该sql,就完成了对xxl-job依赖表的创建。

(4)、执行器部分的编码

在第二步中,我们修改了配置文件中的端口等内容,这些内容为调度中心实际启动后的端口信息,对于执行器,我们需要告诉他,调度中心对外暴露的端口,url地址等信息,以便于执行器启动后,可以通过url接口,向调度中心进行注册,告诉调度中心,有个执行器上线了,而调度中心,也是通过执行器发送过来的请求,确定了执行器的ip端口等数据,这样才能进行接下来的向执行器发送请求,使执行器启动相应的定时任务。

在大致分析了工作原理之后,很明显可以知道,在执行器这里,需要一个相关的配置类,用于启动后和调度中心交换信息。

【1】、配置文件

在xxl-job的源码示例中,有关于配置信息的代码,可以根据这个配置文件进行修改。

xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java

package com.xxl.job.executor.core.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */
@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;//调度中心地址

    @Value("${xxl.job.accessToken}")
    private String accessToken; //调度中心token,默认为空

    @Value("${xxl.job.executor.appname}")
    private String appname;//项目名称,用于在调度中心进行注册

    @Value("${xxl.job.executor.address}")
    private String address;//执行器地址,默认为空,即为执行器自己的地址

    @Value("${xxl.job.executor.ip}")
    private String ip;//执行器ip 默认为空

    @Value("${xxl.job.executor.port}")
    private int port;//执行器端口,这个要写,用于调度中心和执行器进行命令交互

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

    @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.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

}

【2】编写定时任务的实际代码

@Component
public class SampleXxlJob {
    private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);


    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World.");

        for (int i = 0; i < 5; i++) {
            XxlJobHelper.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        // default success
    }
}

这里有几个点需要注意,

  • 首先是需要@component注解,
  • 然后是@xxlJob("xxxxhandler"),通过xxljob注解告诉调度中心该定时任务的名字,并且能够在调度中心通过xxxxhandler的名字来执行定时任务。
  • 参数问题:有些时候,定时任务是执行时才能确定具体参数,在xxljob中,可以通过String command = XxlJobHelper.getJobParam(); 在调度中心执行任务时,来指定具体参数。例如我们在调度中心执行时,传递的参数为“1234”,通过XXlHelper.getJobParam() 获取到的参数为“1234”.

在完成了这些配置之后,启动执行器节点和登录调度中心,就可以在调度中心看到已经注册成功的执行器节点,通过配置,即可启动定时任务。