章
目
录
本文重点讲解SpringBoot如何集成整合xxl-job任务调度框架,上一小节我们讲了《如何快速搭建xxl-job项目详解》,本节我们主要来继续讲下如何将xxl-job的执行器项目集成整合到我们自己的springboot项目中,其实就是在我们springboot项目中配置自定义的执行器,让我们来一起看下吧!
第1步:配置调度中心
首先你要配置xxl-job的调度中心,这个在上一节文章第2步和第3步中讲过,要先准备好初始化SQL和部署好xxl-job-admin项目,这样我们可以可视化操作,如果没有配置好的,先看上一节内容去部署好。
第2步:SpringBoot集成整合xxl-job
接下来,我们开始步入正题,在我们的springboot项目中集成xxl-job。
2.1:准备一个springboot项目
这个就不详细展开了,想必大家都会创建。
2.2:maven依赖
在springboot项目pom文件中引入了 “xxl-job-core” 的maven依赖,这里我引入的是2.4.0版本:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
2.3 执行器配置
在项目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-executor-sample
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”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
2.4 执行器组件配置
执行器组件配置文件大家其实可以参考源码中的xxl-job-executor-springboot项目,我们在自己项目新建config包,然后新建名为XxlJobConfig的配置类:
@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();
*/
}
至此“执行器”项目已经部署结束。
2.3 :执行器集群(可选):
执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。
执行器集群部署时,几点要求和建议:
- 执行器回调地址(xxl.job.admin.addresses)需要保持一致;执行器根据该配置进行执行器自动注册等操作。
- 同一个执行器集群内AppName(xxl.job.executor.appname)需要保持一致;调度中心根据该配置动态发现不同集群的在线执行器列表。
第3步:开发第一个任务
xxl-job支持多种模式来创建定时任务,比如GLUE模式、Bean模式任务等,其中Bean模式任务又支持类形式和方法形式,这里我们来演示一下:
3.1 BEAN模式(类形式)
Bean模式任务,支持基于类的开发方式,每个任务对应一个Java类。
- 优点:不限制项目环境,兼容性好。即使是无框架项目,如main方法直接启动的项目也可以提供支持,可以参考示例项目 “xxl-job-executor-sample-frameless”;
- 缺点:
- 每个任务需要占用一个Java类,造成类的浪费;
- 不支持自动扫描任务并注入到执行器容器,需要手动注入。
步骤1:执行器项目中,开发Job类:
1、开发一个继承自”com.xxl.job.core.handler.IJobHandler”的JobHandler类,实现其中任务方法。比如我这里新建BeanClassJobHandler:
import com.xxl.job.core.handler.IJobHandler;
public class BeanClassJobHandler extends IJobHandler {
@Override
public void execute() throws Exception {
System.out.println("hello www.panziye.com");
}
}
2、手动通过如下方式注入到执行器容器。
XxlJobExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler());
步骤2:调度中心,新建调度任务
后续步骤和 “3.2 BEAN模式(方法形式)”一致,可以看下面参考。
3.2 BEAN模式(方法形式)
Bean模式任务,支持基于方法的开发方式,每个任务对应一个方法。
- 优点:
- 每个任务只需要开发一个方法,并添加”@XxlJob”注解即可,更加方便、快速。
- 支持自动扫描任务并注入到执行器容器。
- 缺点:要求Spring容器环境;
基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务容器中。
步骤1:执行器项目中,开发Job方法:
1、任务开发:在Spring Bean实例中,开发Job方法;
2、注解配置:为Job方法添加注解 “@XxlJob(value=”自定义jobhandler名称”, init = “JobHandler初始化方法”, destroy = “JobHandler销毁方法”)”,注解value值对应的是调度中心新建任务的JobHandler属性的值。
3、执行日志:需要通过 “XxlJobHelper.log” 打印执行日志;
4、任务结果:默认任务结果为 “成功” 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 “XxlJobHelper.handleFail/handleSuccess” 自主设置任务结果;
比如潘老师这里开发如下任务:
@Component
public class BeanMethodJobHandler {
private static Logger logger = LoggerFactory.getLogger(BeanMethodJobHandler.class);
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob("testJobHandler")
public void testJobHandler() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello www.panziye.com.");
for (int i = 0; i < 5; i++) {
XxlJobHelper.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
// default success
}
}
步骤2:调度中心,新建调度任务
在任务调度页面中新建的任务进行参数配置,运行模式选中 “BEAN模式”,JobHandler属性填写任务注解“@XxlJob”中定义的值;
步骤3:手工执行一次
其他执行模式
还有一种执行模式更加简单,可以不用写job类,直接在调度中心页面可视化编辑发布任务,也就是GLUE模式,支持Java、Python、Shell等等,这里就不展开讲解了,有兴趣直接去看xxl-job官方文档吧!
总结
以上就是SpringBoot如何集成整合xxl-job任务调度框架的全部内容,希望对你有帮助哦,欢迎长期关注潘子夜个人博客(https://www.panziye.com),学习愉快哦!