最近写代码发现了一个很好用的定时任务工具,xxljob,为了防止拖延症加上以后忘了怎么用,特此记录一下。
xxl-job定时任务
1、组成
xxljob可以简单的认为是由2部分组成的,调度中心和执行器
- 调度中心:可以理解为管理节点,通过调度中心来管理和调用执行器来最终实现定时任务。
- 执行器:真正的执行节点,通过接收调度中心的命令,最终实现定时任务的执行。
2、使用步骤
(1)、引入相关的依赖
首先访问 https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core
,从中选择喜欢的版本,一般就选择用的最多的高版本就ok,添加到项目的pom.xml文件中。
(2)、配置调度中心
(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”.
在完成了这些配置之后,启动执行器节点和登录调度中心,就可以在调度中心看到已经注册成功的执行器节点,通过配置,即可启动定时任务。