XXL-定时框架

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

源码下载完成后,将整个源码作为一个模块放入项目中,如下:

image-20240924161145852

项目目录结构分析:

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文件之后,数据库生成多张表:

image-20240924161634122

② 修改调度中心的配置文件

调度中心,即源码中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

image-20240924163055723

至此,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、启动任务执行器模块

找到任务启动模块的启动类,启动该模块.可以在控制台看到,该模块已经成功注册到调度中心了.

image-20240924164937391

然后回到调度中心可视化页面,选择 [执行器管理] - [新增]

image-20240924171313668

image-20240924165403280

至此,任务执行器模块已经搭建完成,调度中心跟执行器已经产生连接,可以进行交互了

三、任务类编写与启动

在上面步骤,调度中心与任务执行器模块已经成功产生联系.接下来进行核心业务的任务类的编写.

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、注册任务类

回到调度中心可视化页面; 在调度中心页面 【任务管理】-【新增】 里新增刚才写的任务执行类,保存即可.

image-20240924170107889

image-20240924170414255

可以点击 [操作] - [执行一次]

在 [调度日志] - [选择执行器] 中就能看见刚才任务执行的记录了.

3.3、查看任务执行日志

① 执行日志打印分两种打印

XxlJobHelper.log("这种打印不会出现在控制台,只会在可视化页面能看见");

image-20240924171802160

② 正常的代码打印

private static final Logger logger = LoggerFactory.getLogger(MyTestJob.class);
logger.info("这种就只在控制台打印,可视化界面看不到的");

在这里插入图片描述

-------------------------------------------------完结-------------------------------------------
参考:参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值