xxl-job的集成分服务端(调度中心)和客户端(执行器)。以2.3.0为例看下集成使用:
一、服务端:
核心为xxl-job-admin,为定时任务的可视化管理页面
1、首先,下载xxl-job源码
码云地址:xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
gitHub地址:https://github.com/xuxueli/xxl-job
下载后解压得到以下文件:
2、SQL执行:
sql文件为:xxl-job/doc/db/tables_xxl_job.sql,在mysql数据库中执行该sql,能生成新的数据库xxl-job及相关的数据库表xxl_job_*。目前从源码来看,暂时只支持mysql数据库,如需支持其他数据库,可在源码上进行相关的修改:如mybatis的配置、sql语句等。这里我修改了源码的SQL,修改数据库名为test了(admin管理后台的数据库,不需要和应用为同一个数据库)。
数据库中表介绍:
- xxl_job_group:执行器信息表,维护任务执行器信息;
- xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
- xxl_job_lock:任务调度锁表;
- xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
- xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
- xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
- xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
- xxl_job_user:系统用户表;
3、xxl-job-admin的application.properties配置文件修改:
主要修改spring.datasource.url、spring.datasource.username、spring.datasource.password为自己的配置,server.port、xxl-job-admin等按需修改即可。如我还修改了端口号为7777。
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://localhost:23306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=wtyy
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
### web
server.port=7777
server.servlet.context-path=/xxl-job-admin
4、部署:
xxl-job-core为核心代码块,xxl-job-admin为任务调度中心管理模块,部署的话,部署xxl-job-admin即可。启动成功后,可通过访问http://localhost:7777/xxl-job-admin来对任务调度中心进行访问。用户名密码默认为:admin/123456
二、客户端:业务功能
1、pom:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>job-client</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
2、application.properties:
主要需要配置以下内容
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-demo
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
如我的:
xxl.job.admin.addresses = http://127.0.0.1:7777/xxl-job-admin
xxl.job.executor.ip =
xxl.job.executor.port = 9999
xxl.job.executor.address =
xxl.job.executor.logpath = /data/applogs/xxl-job/jobhandler
xxl.job.executor.appname = test-job
xxl.job.accessToken =
xxl.job.executor.logretentiondays: 1
server.port= 6666
3、XxlJobConfig,从下载的xxl-job源码的/xxl-job-executor-samples/xxl-job-executor-sample-springboot下的src\main\java\com\xxl\job\executor\core\config的XxlJobConfig.java直接复制过来即可。如我的:
package com.job.client.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;
@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;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
*
* 1、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
4、启动类:
package com.job.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ClientStart {
public static void main(String args[]){
SpringApplication.run(ClientStart.class,args);
}
}
5、自定义的job,如我写了两个:
package com.job.client.jobhandle;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
import java.util.Date;
import static com.xxl.job.core.biz.model.ReturnT.SUCCESS;
@Component
public class TestOneHandler {
@XxlJob("TestOneHandler")
public ReturnT<String> jobDemo(String s) throws Exception {
System.out.println("TestOneHandler执行次"+new Date());
return SUCCESS;
}
}
job2:
package com.job.client.jobhandle;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
import java.util.Date;
import static com.xxl.job.core.biz.model.ReturnT.SUCCESS;
@Component
public class TestTwoHandler {
@XxlJob("TestTwoHandler")
public ReturnT<String> jobDemo(String s) throws Exception {
System.out.println("2***TestTwoHandler执行次"+new Date());
return SUCCESS;
}
}
三、启动测试:
1、配置执行器:
只需要配置一次。点击任务调度中心的执行器管理:
在列表中对默认的执行器点击编辑
(1)AppName为客户端配置的xxl.job.executor.appname值
(2)名称:自定义
(3)注册方式:如果选择自动注册,机器地址会自动去获取;如果选择手动注册,机器地址需要自己填写。
2、配置定时任务:
有多少个Job配置多少个。点击任务管理:
在右侧新增一个,如我:
重点注意这个JobHandler,需要和代码中的注解保持一致。点保存后可以在操作中选择执行一次、启动、停止等操作。
我新增了两个任务,一个设置每一分钟执行一次,一个设置每两分钟执行一次。
看下后台:任务执行正常
在调度日志中也能看到:
服务端和客户端如果有一个挂了,直接重启即可,不需要重启另外一个。