XXL-定时框架
springBoot版本:2.1.2
xxl版本:2.4.2-SNAPSHOT
一、框架下载与集成
1.1、框架源码项目下载
xxl有调度中心跟任务执行器两个部分,任务执行器 需要向 调度中心 进行注册,注册成功后才能交由调度中心去统一管理任务的增删启停。
调度中心需要去托管平台下载源码,,然后放入项目中,并作为一个模块启动。
源码地址:
github仓库地址: https://github.com/xuxueli/xxl-job
gitee仓库地址: http://gitee.com/xuxueli0323/xxl-job
源码下载完成后,将整个源码作为一个模块放入项目中,如下:
项目目录结构分析:
xxl-job-admin -- 调度中心
xxl-job-core -- 框架需要的公共依赖
xxl-job-executor-samples -- 框架给的,编写任务执行器的示例(此模块是任务执行器示例模块,可以把任务类放在该模块下)
|
|-- xxl-job-executor-sample-springboot:通过Springboot管理执行器,推荐这种方式;
|
|-- xxl-job-executor-sample-frameless:无框架版本,这里不使用,无需理会;
1.2、启动调度中心
① 调度中心启动是需要连接到数据库,并链接到框架需要的多个表中的.表结构文件位于 /xxl-job/doc/db/tables_xxl_job.sql 位置.执行给的sql文件之后,数据库生成多张表:
② 修改调度中心的配置文件
调度中心,即源码中xxl_job_admin 模块,想要正常启动调度中心,需要修改调度中心的配置,使其链接到自己的数据库.
调度中心配置文件地址:/xxl-job/xxl-job-admin/src/main/resources/application.properties
具体配置含义:
### 服务部署的端口,可以进行修改;例如修改为8081 那么后续任务执行器注册的端口也要同步改成 8081
server.port=8080
server.servlet.context-path=/xxl-job-admin
###调度中心JDBC链接:链接地址和之前所创建的调度数据库的地址一致;注意IP地址需要更改为自己的数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
### 执行器通讯TOKEN,后续要跟任务执行器配置的accessToken一致,要不然无法连接注册
xxl.job.accessToken=default_token
### 报警邮箱,定时任务报错发报警信息到对应的邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=30
③ 启动调度中心
启动类位于: xxl-job/xxl-job-admin/src/main/java/com/xxl/job/admin/XxlJobAdminApplication.java
1.3、访问调度中心可视化页面
上一步调度中心成功启动后,即可在浏览器中访问 http://localhost:8080/xxl-job-admin 进入调度中心可视化页面了;
登录密码统一为: admin/123456
至此,xxl框架调度中心集成并启动成功
二、任务执行器模块编写与注册
上个章节是启动调度中心; 调度中心本身不放具体的业务代码(也就是任务执行类),“调度中心”负责向每个注册到他这里的任务执行器模块去发起调度请求,从而去执行业务. 本章节介绍任务执行器模块的编写注册启动.
2.1、引入依赖,添加配置
首先,在作为任务执行器的模块的pom文件中,引入框架的核心依赖 :
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
-- 这里版本跟下载的源码版本保持一致
<version>${project.parent.version}</version>
</dependency>
然后在该模块的yml配置中添加框架配置:
xxl:
job:
admin:
# 调度中心服务部署的地址
addresses: http://localhost:8080/xxl-job-admin
# 执行器通讯TOKEN,要和调度中心服务部署配置的accessToken一致,要不然无法连接注册
accessToken: default_token
executor:
# 执行器AppName
appname: my-springBoot-xxl-app
# 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
address:
ip:
#执行器端口号:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
port: 8887
# 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
logpath:
# 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 30
2.2、添加框架config配置类
加上配置类XxlJobConfig.java,这会使得 启动springboot项目时去连接调度中心服务.
配置类具体代码:
/**
* @author ByChen
* @date 2024/9/11 15:36
*/
@Configuration
public class XxlJobConfig {
private final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
/**
* 执行器通讯TOKEN,非空时启用
**/
@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;
/**
* 执行器模块IP 默认为空表示自动获取IP
**/
@Value("${xxl.job.executor.ip}")
private String ip;
/**
* 执行器注册到调度中心的端口,每个模块要区分开
**/
@Value("${xxl.job.executor.port}")
private int port;
/**
* 执行器运行日志文件存储磁盘路径 需要对该路径拥有读写权限 为空则使用默认路径
**/
@Value("${xxl.job.executor.logpath}")
private String logPath;
/**
* 执行器日志文件保存天数 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能
**/
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
/**
* 配置类,启动springboot项目时连接调度中心服务
*
* @return 返回一个XxlJobSpringExecutor对象
*/
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info("开始注册xxi-job");
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;
}
}
2.3、启动任务执行器模块
找到任务启动模块的启动类,启动该模块.可以在控制台看到,该模块已经成功注册到调度中心了.
然后回到调度中心可视化页面,选择 [执行器管理] - [新增]
至此,任务执行器模块已经搭建完成,调度中心跟执行器已经产生连接,可以进行交互了
三、任务类编写与启动
在上面步骤,调度中心与任务执行器模块已经成功产生联系.接下来进行核心业务的任务类的编写.
3.1、任务类代码编写
编写任务执行类(准确来说是编写方法,并加上注解@XxlJob(“name”)) name为该执行任务的唯一名称
示例代码:
import com.spring.entity.DoLog;
import com.spring.mapper.DbMapper;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import groovy.util.logging.Slf4j;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* XxlJob开发示例(Bean模式 - 方法形式)
* <p>
* 开发步骤:
* 1、任务开发:在Spring Bean实例中,开发Job方法;
* 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
* 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
*
* @author ByChen
* @date 2024/9/11 15:49
*/
@Slf4j
@Component
@AllArgsConstructor
public class MyTestJob {
private static final Logger logger = LoggerFactory.getLogger(MyTestJob.class);
private final DbMapper dbMapper;
/**
* 1、简单任务示例(Bean模式 - 方法形式)
*/
@XxlJob(value = "myJobHandler", init = "init", destroy = "destroy")
public void myJobHandler() {
//XxlJobHelper.log 打印的日志不会打印在控制台上,只能在调度中心页面执行日志里面查看
XxlJobHelper.log("调度中心打印 开始执行定时任务。。");
logger.info("控制台打印 开始执行定时任务。。");
for (int i = 0; i < 5; i++) {
logger.info("控制台打印:beat at:{}", i);
XxlJobHelper.log("调度中心打印beat at:" + i);
dbMapper.saveDoLog(new DoLog().setDoNum(i).setDoTime(new Date()).setUserId("me"));
}
}
/**
* 给定时器绑定的初始化前方法
* 执行时机:会在进入接口执行之前执行
*/
public void init() {
logger.info("先进入初始化方法。。");
}
/**
* 给定时器绑定的初始化前方法
* 执行时机:暂未搞明白什么时候触发?猜测可能是给该任务分配的线程被回收的时候触发
*/
public void destroy() {
logger.info("最后执行销毁方法");
}
}
3.2、注册任务类
回到调度中心可视化页面; 在调度中心页面 【任务管理】-【新增】 里新增刚才写的任务执行类,保存即可.
可以点击 [操作] - [执行一次]
在 [调度日志] - [选择执行器] 中就能看见刚才任务执行的记录了.
3.3、查看任务执行日志
① 执行日志打印分两种打印
XxlJobHelper.log("这种打印不会出现在控制台,只会在可视化页面能看见");
② 正常的代码打印
private static final Logger logger = LoggerFactory.getLogger(MyTestJob.class);
logger.info("这种就只在控制台打印,可视化界面看不到的");
-------------------------------------------------完结-------------------------------------------
参考:参考