1、前言
工作中肯定会遇到编写定时任务的场景,手动声明定时任务的cron表达式,改动执行时间需要改代码,想随时执行任务得手动调用方法,这些操作任务的方式比较不灵活,使用任务调度平台的话,则比较容易操作任何和变更。
这里介绍如何接入任务调度平台XXL-JOB,选用这个平台主要是公司使用这个平台,比较熟悉。
官网概述:
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
官网:XXL开源社区
github:https://github.com/xuxueli/xxl-job
环境搭建包含3个模块:
1、xxljob项目的数据库
2、xxljob源码编译的xxl-job-admin项目
3、集成项目的xxl-job-core
系统环境
xxl-job版本:2.4.2
xxl-job:项目要求
Maven3+
Jdk1.8+
Mysql8.0+
2、clone项目和准备数据库
使用命令:
git clone https://github.com/xuxueli/xxl-job.git
将项目clone到本地
在自己数据库工具,新建一个名字的xxl_job的数据库
或者mysql命令行使用sql语句创建:
create database xxl_job;
这个名字可以按照自己喜好起其他名字也行,这个数据库。
接着渠道xxl-job项目找到doc文件夹下面的db文件的tables_xxl_job.sql文件,在执行命令sql文件,即可完成数据库的建立。如果使用了其他数据库名字,改下sql文件的创建数据库语句即可。
3、admin项目的编译和启动
1、将xxl-job项目导入idea,将依赖下载完
2、修改application.properties的spring.datasource.url和账户密码等信息
3、使用maven编译出admin项目即可
打包前可以先运行下admin项目,直接访问下,看看是否正常,再执行打包。
本地测试地址为:http://127.0.0.1:你设置的端口/xxl-job-admin/
我的是:http://127.0.0.1:9898/xxl-job-admin/
由于项目是spring boot项目直接使用:
java -jar 打包出来的jar包路径/xxl-job-admin-2.4.2-SNAPSHOT.jar
4、项目添加xxl-job
给项目添加以下maven依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.0</version>
</dependency>
在application.yaml添加如下配置:
xxl:
job:
admin:
addresses: http://127.0.0.1:9898/xxl-job-admin
accessToken: default_token
executor:
appname: xxlReport
address:
ip:
port: 9998
logpath: /data/log/xxl-report/xxl-job/jobhandler
logretentiondays: 30
新建如下spring boot配置类,代码加载配置:
@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;
}
}
启动时就会按照ip和端口去连接admin。
配置完成,后则需要编写任务代码:
@Component
public class SampleXxlJob {
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
String param = XxlJobHelper.getJobParam();
if (param != null && param.equals("1")) {
XxlJobHelper.handleSuccess();
} else {
XxlJobHelper.handleFail();
}
}
}
服务端的代码就这么多了
5、admin项目执行任务
新增执行器:
选择执行器管理,点击新增,填写AppName、名称,注册方式选择手动注册,机器地址填写完整的http网址,以斜杠结尾
,多个用逗号隔开。
点击任务管理器,选择之前新建的xxl-report执行器
点击新增,填上必填,里面的重点是cron表达式,填上对应的表达式,填上程序的JobHandler的名字,点击保存
启动任务则按照corn表达式调度,还能手动进行调度。
按照代码的param控制任务是否失败。实际业务则根据任务是否有错误信息,确认任务是否失败
到这里实践就结束了。
6、admin任务选项
6.1、基础配置
执行器:执行当前任务的服务列表,下拉选择执行器
任务描述:用于描述当前任务的文字
负责人:填上负责人
报警邮件:任务失败时,发送邮件到填写的邮件列表,多个则用逗号分隔
note:发送邮件需要指定发送邮件的配置,在admin项目里面设置相关邮件配置,并编译启动才能设置
6.2、调度配置
调度类型:其实默认使用cron就行
cron:cron表达式填写或者右边按钮选择,和代码的声明格式一致,不做赘述
6.3、任务配置
运行模式:bean就是运行spring的任务方法、其他选项则是对应语言的代码执行器,在xxl-job内置的ide里面写对应的代码
JobHandler:仅在bean模式生效
任务参数:填写任务执行过程中的参数,用于动态控制任务行为。比如传:stDate=2024-05-08 edDate=2024-05-08,这种键值对的值,进过解析后,用于控制报表任务跑时间区间的数据
6.4、高级配置
路由策略:就是怎么轮询执行器的注册地址列表的方式,见名知意,不做赘述
阻塞处理策略:
单机串行:等待上一个完成后面的才会执行,如果执行时间超过时间间隔则任务会一直堆积,如果只是时不时超时,任务还是会回到间隔内完成任务。
丢弃后续调度:如果任务执行时间超过间隔时间,则下一任务直接失败,让当前任务继续执行。
覆盖之前调度:如果任务执行时间超过间隔时间,则给当前任务发送InterruptedException,并标记为失败,下一任务开始执行,但是如果上一任务try catch了exception,没有处理InterruptedException,实际上一任务还是会执行
note:
对于执行时间不定的,但是最终会回到间隔内的任务,选用单机串行即可。
对于一直超过时间间隔的,那就是调整下corn的时间间隔解决。
对于需要知道任务是否会超时的,可以选后面两个,任务失败会发邮件提醒,知道任务失败,做出调整。
对于出现消息大面积堆积,可以使用丢弃后续调度,让后续任务默认失败,当不发失败告警时,说明系统已经处理完堆积的消息了,是个提醒的使用。
spring的demo地址:https://gitee.com/1099764422/xxl-report