XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
本教程主要介绍怎么在spring boot工程中快速使用xxl-job。详细的xxl-job的使用文档请参考:https://www.xuxueli.com/xxl-job/
在xxl-job中,有2个角色:
整个调度任务执行流程如下:
Xxl-job-admin是调度任务的管理中心。所有的excutor都会向xxl-job-admin注册,注册完成之后可以对excutor进行任务分发。
在官网中下载最新的release代码,比如本文中的v2.2.0版本,下载地址为https://github.com/xuxueli/xxl-job/releases。
Xxl-job-admin需要Mysql数据库,请提前准备安装好。然后在数据库中导入代码工程中的doc/sql目录下的s ql文件。
然后修改xxl-job-admin工程中的resources中的application.properties的数据库配置,如下:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
修改之后,启动XxlJobAdminApplication的main函数,xxl-job-admin启动成功。
在浏览器上访问http://localhost:8081/xxl-job-admin/ ,登陆用户名为admin,密码为123456。登陆成功后,显示的界面如下:
xxl-job-excutor是任务的执行单元,需要在业务系统中去实现。本案例中是一个springboot的工程,此工程需要集成xxl-job作为任务执行单元。在工程的pom.xml文件中引入xxl-job-core的依赖如下:
<dependency>
<groupId>com.xuxueligroupId>
<artifactId>xxl-job-coreartifactId>
<version>2.2.0version>
dependency>
在工程的application.properties中配置xxl.job.admin.addresses的地址,配置含义见注释,具体配置如下:
# web port
server.port=8082
# no web
#spring.main.web-environment=false
# log config
logging.config=classpath:logback.xml
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8081/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=../applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30
需要初始化一个XxlJobSpringExecutor,该类用于处理xxl-job-admin和xxl-job-excutor之间的通讯以及任务的处理。
@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;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@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.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
注册一个任务,任务名为demoJobHandler。
@Component
public class SampleXxlJob {
private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob("demoJobHandler")
public ReturnT<String> demoJobHandler(String param) throws Exception {
XxlJobLogger.log("XXL-JOB, Hello World.");
logger.info("XXL-JOB, Hello World. params:"+param);
for (int i = 0; i < 5; i++) {
XxlJobLogger.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
return ReturnT.SUCCESS;
}
}
在xxl-job-admin中可以看到demoJobHandler的配置,在控制台启动任务。
启动任务后,可以看到执行任务的日志。同时在xxl-job-excutor中可以看到任务执行的业务日志。
https://github.com/forezp/distributed-lab/tree/master/xxl-job