目录
1. 介绍
2. SpringBoot整合xxl-job
2.1. 配置数据库
2.2. 运行调动中心
2.3. 整合业务服务
2.3.1. 引入maven依赖
2.3.2. 创建业务服务配置类
2.3.3. 创建定时任务
xxl-job是一个分布式定时器任务派遣服务,这个项目主要有以下三部分组成 :
- xxl-job-admin: 调动中心,主要是提供任务管理平台的页面,需要把该模块单独打包作为一个服务部署,定时器再执行时,是通过该服务去调用我们的业务服务完成任务执行。
- xxl-job-core: 公共依赖模块,在整合业务服务的时候,需要引入该依赖。
- xxl-job-executor-samples:官方提供的demo。
点击
访问gitee获取该项目,在 /doc/db/tables_xxl_job.sql的路径中有SQL文件,需要将他导入到你自己的MySQL中。
表介绍:
修改 xxl-job-admin 模块 application.properties 的配置信息。
修改MySQL为你数据库的真实信息
修改邮箱服务配置(可选非必须)
以上配置都修改完成后,运行 xxl-job-admin 这个服务,上面说过它是一个调度中心,主要是提供任务管理平台的页面。所以当你的业务服务部署了,这个模块也要作为一个服务单独部署,这样才可以管理你业务中定时任务。
接下来整合我们自己的业务服务,xxl-job-executor-sample-springboot 这个模块是官方提供的整合demo 模块,可以参考它整合自己的业务。
com.xuxueli xxl-job-core2.4.0
注意:一定要确保你的 业务服务 和 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 中的accessToken统一 xxl.job.accessToken=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 配置类
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.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.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、引入依赖: ** * * 2、配置文件,或者容器启动变量 * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.' * * 3、获取IP * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); */ }org.springframework.cloud * spring-cloud-commons *${version} *
创建一个测试任务
2.3.3.1:bean模式任务
import com.xxl.job.core.handler.annotation.XxlJob; import org.springframework.stereotype.Component; /** * @author yazb * 测试 */ @Component public class TestTask { @XxlJob("hello") public void demoJobHandler() throws Exception { System.out.println("hello---->xxl-job"); // default success } }
访问 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-----》"); }