目录
1. 介绍
2. SpringBoot整合xxl-job
2.1. 配置数据库
2.2. 运行调动中心
2.3. 整合业务服务
2.3.1. 引入maven依赖
2.3.2. 创建业务服务配置类
2.3.3. 创建定时任务
1. 介绍
xxl-job是一个分布式定时器任务派遣服务,这个项目主要有以下三部分组成 :
- xxl-job-admin: 调动中心,主要是提供任务管理平台的页面,需要把该模块单独打包作为一个服务部署,定时器再执行时,是通过该服务去调用我们的业务服务完成任务执行。
- xxl-job-core: 公共依赖模块,在整合业务服务的时候,需要引入该依赖。
- xxl-job-executor-samples:官方提供的demo。
2. SpringBoot整合xxl-job
2.1. 配置数据库
点击<xxl_job_gitee> 访问gitee获取该项目,在 /doc/db/tables_xxl_job.sql的路径中有SQL文件,需要将他导入到你自己的MySQL中。
表介绍:
2.2. 运行调动中心
修改 xxl-job-admin 模块 application.properties 的配置信息。
修改MySQL为你数据库的真实信息
修改邮箱服务配置(可选非必须)
以上配置都修改完成后,运行 xxl-job-admin 这个服务,上面说过它是一个调度中心,主要是提供任务管理平台的页面。所以当你的业务服务部署了,这个模块也要作为一个服务单独部署,这样才可以管理你业务中定时任务。
2.3. 整合业务服务
接下来整合我们自己的业务服务,xxl-job-executor-sample-springboot 这个模块是官方提供的整合demo 模块,可以参考它整合自己的业务。
2.3.1. 引入maven依赖
<!-- xxl-job依赖,maven仓库有该依赖,不需要手动安装 -->
<dependency>
<groupId>***.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
2.3.2. 创建业务服务配置类
注意:一定要确保你的 业务服务 和 xxl-job-admin 这个服务连接的是同一个数据库
application.properties配置
### 调度中心的地址 ,就是 xxl-job-admin 这个服务的地址
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### token (ke为空), 要和xxl-job-admin 中的a***essToken统一
xxl.job.a***essToken=default_token
### 执行器名称,可自定义
xxl.job.executor.appname=xxl-job-executor-sample
### 会将该地址注册到调度中心,调度中心会用该地址调度任务, 可为空默认就是 ip:port , 端口不可以和业务端口重复
xxl.job.executor.address=
### 可为空,默认获取本机ip
xxl.job.executor.ip=
xxl.job.executor.port=9999
### 运行日志所保存的路径
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 日志存放时间
xxl.job.executor.logretentiondays=30
创建:FrameLessXxlJobConfig 配置类
java">
import ***.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* xxl-job config
*
* @author yazb
*/
@Configuration
public class FrameLessXxlJobConfig {
private Logger logger = LoggerFactory.getLogger(FrameLessXxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.a***essToken}")
private String a***essToken;
@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.setA***essToken(a***essToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-***mons" 提供的 "I***Utils" 组件灵活定制注册IP;
*
* 1、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-***mons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.i***utils.preferred-***works: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = i***Utils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
2.3.3. 创建定时任务
创建一个测试任务
2.3.3.1:bean模式任务
import ***.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.***ponent;
/**
* @author yazb
* 测试
*/
@***ponent
public class TestTask {
@XxlJob("hello")
public void demoJobHandler() throws Exception {
System.out.println("hello---->xxl-job");
// default su***ess
}
}
访问 xxl-job-admin 这个服务,在页面中运行定时任务。
用户:admin
密码:123456
创建定时任务
运行定时任务
2.3.3.2:分片广播任务模式
分片广播模式,用来运行创建集群环境中的定时任务,所以需要我们再创建一个服务测试。
分片广播模式,会同时运行你集群中所有节点服务中定时任务。要想保证避免任务重复执行。可以采用 单机路由策略(如:第一台、一致性哈希)” + “阻塞策略(如:单机串行、丢弃后续调度)” 来规避,最终避免任务重复执行。
已经注册到调度中心的服务
创建分布式广播任务
/**
* 2、分片广播任务
*/
@XxlJob("shardingJobHandler")
public void shardingJobHandler() throws Exception {
// 分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
System.out.println("测试服务 9998-----》");
}