签入版本

This commit is contained in:
2026-09-28 18:51:35 +08:00
commit ab0f064ea6
2692 changed files with 354751 additions and 0 deletions
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.xiaomayi</groupId>
<artifactId>xiaomayi-common</artifactId>
<version>${revision}</version>
</parent>
<artifactId>xiaomayi-scheduler</artifactId>
<!-- 依赖声明 -->
<dependencies>
<!-- 核心依赖模块 -->
<dependency>
<groupId>com.xiaomayi</groupId>
<artifactId>xiaomayi-core</artifactId>
</dependency>
<!-- quartz定时器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!-- dexcoder依赖 -->
<dependency>
<groupId>com.dexcoder</groupId>
<artifactId>dexcoder-dal-spring</artifactId>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,116 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.constant;
/**
* <p>
* 任务调度常量类
* 定义Quartz定时任务调度相关的常量配置
* 主要用于任务名称、参数键等标识符的统一管理
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
public class ScheduleConstant {
/**
* 任务类名前缀常量
* 用途:用于生成唯一的任务标识名称
* 格式:TASK_CLASS_NAME_ + 任务ID
* 示例:TASK_CLASS_NAME_1001, TASK_CLASS_NAME_1002
* <p>
* 在Quartz调度器中用于:
* 1. JobKey的命名:TASK_CLASS_NAME_ + 格式化后的任务ID
* 2. TriggerKey的命名:TASK_CLASS_NAME_ + 任务ID
* <p>
* 注意:此常量确保任务标识的唯一性和规范性
*/
public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME_";
/**
* 任务调度参数键常量
* 用途:作为JobDataMap中的键,用于存储和获取任务执行时需要的参数
* <p>
* 在任务调度过程中的使用场景:
* 1. 创建任务时:将任务参数对象存入JobDataMap,key为TASK_SCHEDULE_PARAM
* 2. 任务执行时:从JobDataMap中通过TASK_SCHEDULE_PARAM键获取任务参数
* <p>
* 示例:
* jobDetail.getJobDataMap().put(TASK_SCHEDULE_PARAM, scheduleJob);
* ScheduleJob jobParam = (ScheduleJob) jobDataMap.get(TASK_SCHEDULE_PARAM);
* <p>
* 作用:实现任务配置参数在调度器和执行器之间的传递
*/
public static final String TASK_SCHEDULE_PARAM = "TASK_SCHEDULE_PARAM";
}
@@ -0,0 +1,196 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.event;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* <p>
* 任务调度初始化事件抽象基类
* <p>
* 功能说明:
* 1. 提供统一的定时任务初始化模板,确保应用启动时自动加载和初始化任务调度
* 2. 采用模板方法设计模式,子类只需实现具体的任务初始化逻辑
* 3. 通过Spring生命周期管理,在Bean初始化完成后自动执行任务调度初始化
* <p>
* 设计模式:模板方法模式
* - 固定流程:init() 方法定义了初始化的固定流程(开始日志 -> 初始化 -> 结束日志)
* - 可变部分:initScheduleJob() 由子类实现具体的任务初始化逻辑
* <p>
* 执行时机:
* - 在Spring容器完成Bean的依赖注入后立即执行
* - 在应用启动过程中自动触发,无需手动调用
* - 确保在服务接收请求前完成任务调度的准备工作
* <p>
* 使用方式:
* 1. 创建子类继承本抽象类并添加 @Component 注解
* 2. 在子类中实现 initScheduleJob() 方法,编写具体的任务初始化逻辑
* 3. Spring容器会自动识别并执行初始化流程
* <p>
* 典型应用场景:
* - 数据库中的定时任务配置加载到Quartz调度器
* - 系统默认任务的自动注册和启动
* - 任务状态恢复(如应用重启后恢复运行中的任务)
* - 集群环境下的任务协调初始化
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
@Slf4j
@Component
public abstract class ScheduleJobEvent {
/**
* 任务调度初始化入口方法
* <p>
* 功能:在Spring Bean初始化完成后自动执行任务调度初始化流程
* 执行时机:Bean的依赖注入完成后,通过 @PostConstruct 注解确保在应用启动时执行
* <p>
* 执行流程:
* 1. 记录初始化开始日志(条件判断优化性能)
* 2. 调用抽象方法执行具体的任务初始化逻辑
* 3. 记录初始化完成日志
* 4. 异常处理:如果初始化过程中发生异常,会记录错误日志并抛出运行时异常
* <p>
* 性能优化:
* - 使用 log.isInfoEnabled() 条件判断,避免不必要的字符串拼接
* - 在日志级别较低时减少性能开销
* <p>
* 异常处理:
* - 初始化过程中的异常会向上抛出,导致应用启动失败
* - 这是设计上的考虑,因为任务调度初始化失败通常意味着严重问题
* - 子类应该妥善处理自身的异常,避免影响应用正常启动
*
* @throws RuntimeException 当任务调度初始化过程中发生不可恢复的错误时抛出
* @see PostConstruct JSR-250 标准注解,定义初始化后执行的方法
*/
@PostConstruct
private void init() {
// 记录初始化开始日志(条件判断优化性能)
if (log.isInfoEnabled()) {
log.info("任务调度初始化开始...");
}
try {
// 调用抽象方法执行具体的任务初始化逻辑
// 此方法由子类实现,用于加载和初始化具体的定时任务
initScheduleJob();
} catch (Exception e) {
// 记录初始化失败日志
log.error("任务调度初始化失败,应用启动中止", e);
// 抛出运行时异常,中止应用启动过程
// 这是设计选择:任务调度初始化失败视为严重错误
throw new RuntimeException("任务调度初始化失败", e);
}
// 记录初始化完成日志(条件判断优化性能)
if (log.isInfoEnabled()) {
log.info("任务调度初始化结束...");
}
}
/**
* 初始化任务调度抽象方法
* <p>
* 功能:由子类实现具体的任务调度初始化逻辑
* 职责:子类负责加载、配置和启动具体的定时任务
* <p>
* 典型实现内容:
* 1. 从数据库加载任务配置信息
* 2. 初始化Quartz调度器实例
* 3. 创建和注册定时任务到调度器
* 4. 启动调度器开始执行任务
* 5. 恢复之前运行中的任务状态
* 6. 处理集群环境下的任务协调
* <p>
* 实现要求:
* - 应该处理可能出现的异常,避免影响应用启动
* - 需要考虑线程安全性,特别是在集群环境下
* - 应该记录详细的初始化过程日志,便于问题排查
* - 需要确保任务的幂等性,避免重复初始化
* <p>
* 注意事项:
* - 此方法在应用启动时执行,应该尽量快速完成
* - 对于耗时的初始化操作,考虑异步处理或分阶段初始化
* - 需要确保在初始化过程中不会阻塞应用启动流程
*
* @throws Exception 当任务初始化过程中发生错误时抛出
* 异常会向上传播,导致应用启动失败
* 子类应该根据业务重要性决定是否抛出异常
*/
public abstract void initScheduleJob() throws Exception;
}
@@ -0,0 +1,114 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.exception;
import com.dexcoder.commons.exceptions.DexcoderException;
/**
* <p>
* 定时任务自定义异常
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
public class ScheduleException extends DexcoderException {
/**
* Instantiates a new ScheduleException.
*
* @param e the e
*/
public ScheduleException(Throwable e) {
super(e);
}
/**
* Constructor
*
* @param message the message
*/
public ScheduleException(String message) {
super(message);
}
/**
* Constructor
*
* @param code the code
* @param message the message
*/
public ScheduleException(String code, String message) {
super(code, message);
}
}
@@ -0,0 +1,206 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.factory;
import com.xiaomayi.core.utils.SpringUtils;
import com.xiaomayi.scheduler.model.ScheduleJob;
import com.xiaomayi.scheduler.service.JobResolverService;
import com.xiaomayi.scheduler.utils.JobExecuteUtils;
import com.xiaomayi.scheduler.vo.ScheduleJobLogVO;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
/**
* <p>
* 异步任务工厂类
* <p>
* 功能说明:
* 1. 继承自 ScheduleJobFactory 抽象基类,实现异步任务的具体执行逻辑
* 2. 采用异步执行方式,允许任务并发执行,适用于耗时较短、可并发的业务场景
* 3. 通过 Quartz 的线程池实现任务的异步执行,提高系统吞吐量
* <p>
* 适用场景:
* - 数据同步任务
* - 消息推送任务
* - 缓存更新任务
* - 其他可以并行处理的轻量级任务
* <p>
* 注意事项:
* - 异步任务执行时不会阻塞其他任务的调度
* - 需要确保任务逻辑是线程安全的
* - 适用于执行时间较短的任务,长时间任务建议使用同步方式
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
@Slf4j
public class AsyncJobFactory extends ScheduleJobFactory {
/**
* 异步任务执行方法
* <p>
* 功能:执行具体的异步任务业务逻辑
* 特点:在独立的线程中执行,不会阻塞任务调度器的其他任务
* <p>
* 执行流程:
* 1. 记录任务开始执行日志
* 2. 通过 JobExecuteUtils 工具类调用任务目标方法
* 3. 任务在后台线程中异步执行
* 4. 记录任务执行完成日志
*
* @param context Quartz任务执行上下文,包含任务触发器、任务详情等信息
* @param scheduleJob 定时任务配置对象,包含任务参数、执行URL等配置信息
* @throws Exception 当任务执行过程中发生异常时抛出,异常会被基类统一处理并记录日志
* @see JobExecuteUtils#invokeMethod(ScheduleJob) 任务方法调用工具类
*/
@Override
protected void doExecute(JobExecutionContext context, ScheduleJob scheduleJob) throws Exception {
// 记录异步任务开始执行日志
log.info("开始执行异步任务,任务名称:{},任务ID:{},任务分组:{}",
scheduleJob.getJobName(), scheduleJob.getId(), scheduleJob.getJobGroup());
try {
// 通过工具类执行具体的任务方法
// JobExecuteUtils.invokeMethod() 方法会根据任务配置调用相应的业务方法
// 异步特性:此方法调用后立即返回,实际任务在后台线程中执行
JobExecuteUtils.invokeMethod(scheduleJob);
// 记录任务提交执行成功日志
log.debug("异步任务提交执行成功,任务名称:{},任务ID:{}",
scheduleJob.getJobName(), scheduleJob.getId());
} catch (Exception e) {
// 记录任务执行异常日志
log.error("异步任务执行失败,任务名称:{},任务ID:{},异常信息:{}",
scheduleJob.getJobName(), scheduleJob.getId(), e.getMessage(), e);
// 将异常继续抛出,由基类统一处理异常和记录错误日志
throw e;
}
// 记录异步任务执行完成日志
log.info("异步任务执行完成,任务名称:{},任务ID:{}",
scheduleJob.getJobName(), scheduleJob.getId());
}
/**
* 保存任务执行日志
* <p>
* 功能:将任务执行日志持久化到数据库或其他存储介质
* 实现方式:通过 Spring 容器获取 JobResolverService Bean 来执行日志存储操作
* <p>
* 存储内容:
* - 任务基本信息(任务ID、名称、分组等)
* - 执行时间信息(开始时间、结束时间、执行耗时)
* - 执行状态(成功/失败)
* - 异常信息(如果执行失败)
*
* @param scheduleJobLogVO 任务执行日志值对象,包含完整的任务执行记录信息
* @return boolean 日志保存结果
* true - 日志保存成功
* false - 日志保存失败
* @see JobResolverService#addJobLog(ScheduleJobLogVO) 日志服务接口
* @see SpringUtils#getBean(Class) Spring Bean 获取工具类
*/
@Override
protected boolean addJobLog(ScheduleJobLogVO scheduleJobLogVO) {
// 记录日志保存开始
log.debug("开始保存异步任务执行日志,任务名称:{},任务ID:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobId());
try {
// 从 Spring 容器中获取任务解析服务 Bean
// 使用依赖查找而非依赖注入,避免循环依赖问题
JobResolverService jobResolverService = SpringUtils.getBean(JobResolverService.class);
// 调用服务方法保存任务执行日志
boolean saveResult = jobResolverService.addJobLog(scheduleJobLogVO);
// 记录日志保存结果
if (saveResult) {
log.debug("异步任务执行日志保存成功,任务名称:{},任务ID:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobId());
} else {
log.warn("异步任务执行日志保存失败,任务名称:{},任务ID:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobId());
}
return saveResult;
} catch (Exception e) {
// 记录日志保存异常
log.error("保存异步任务执行日志时发生异常,任务名称:{},任务ID:{},异常信息:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobId(), e.getMessage(), e);
return false;
}
}
}
@@ -0,0 +1,285 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.factory;
import com.xiaomayi.core.utils.StringUtils;
import com.xiaomayi.scheduler.constant.ScheduleConstant;
import com.xiaomayi.scheduler.model.ScheduleJob;
import com.xiaomayi.scheduler.vo.ScheduleJobLogVO;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
/**
* <p>
* 任务调度抽象执行器基类
* <p>
* 功能说明:
* 1. 提供统一的定时任务执行模板,封装任务执行的前置处理、后置处理和异常处理
* 2. 自动记录任务执行日志,包括执行时间、耗时、状态等信息
* 3. 采用模板方法设计模式,子类只需关注具体的业务逻辑实现
* <p>
* 设计模式:模板方法模式
* - 固定流程:executeInternal() 方法定义了固定的执行流程
* - 可变部分:doExecute() 和 addJobLog() 由子类实现具体业务逻辑
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
@Slf4j
public abstract class ScheduleJobFactory extends QuartzJobBean {
/**
* 线程本地变量,用于在任务执行过程中传递开始时间
* 用途:在多线程环境下,确保每个任务的开始时间独立存储,避免线程间数据污染
* 生命周期:任务开始时设置,任务结束后清理
*/
private static final ThreadLocal<LocalDateTime> threadLocal = new ThreadLocal<>();
/**
* Quartz任务执行入口方法
* 模板方法:定义了任务执行的固定流程,子类不能重写此方法
* 执行流程:前置处理 -> 业务执行 -> 后置处理(包含异常处理)
*
* @param context Quartz任务执行上下文,包含任务配置、触发器信息等
* @throws JobExecutionException 当任务执行过程中发生异常时抛出
*/
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
ScheduleJob scheduleJob = null;
try {
// 1. 从任务上下文中获取任务配置参数
JobDataMap mergedJobDataMap = context.getMergedJobDataMap();
scheduleJob = (ScheduleJob) mergedJobDataMap.get(ScheduleConstant.TASK_SCHEDULE_PARAM);
// 2. 记录任务开始执行日志
log.info("开始执行定时任务,任务名称:{},任务详情:{}", scheduleJob.getJobName(), scheduleJob);
// 3. 执行前置处理:记录开始时间、初始化执行环境
doBefore(context, scheduleJob);
// 4. 执行具体的业务逻辑(由子类实现)
doExecute(context, scheduleJob);
// 5. 执行后置处理:记录成功日志、计算执行耗时
doAfter(context, scheduleJob, null);
} catch (Exception e) {
// 6. 异常处理:记录异常信息、执行失败的后置处理
log.error("定时任务执行异常,任务名称:{},异常信息:{}",
scheduleJob != null ? scheduleJob.getJobName() : "未知任务", e.getMessage(), e);
// 7. 执行异常情况的后置处理
assert scheduleJob != null;
doAfter(context, scheduleJob, e);
// 8. 将检查异常转换为Quartz要求的运行时异常
throw new JobExecutionException("定时任务执行失败", e, false);
}
}
/**
* 任务执行前置处理方法
* 功能:记录任务开始时间、初始化执行环境、记录开始日志
*
* @param context Quartz任务执行上下文
* @param scheduleJob 定时任务配置信息
*/
protected void doBefore(JobExecutionContext context, ScheduleJob scheduleJob) {
// 记录任务开始执行日志
log.info("定时任务开始执行,任务名称:{},任务分组:{}",
scheduleJob.getJobName(), scheduleJob.getJobGroup());
// 记录任务开始时间到线程本地变量,用于后续计算执行耗时
LocalDateTime startTime = LocalDateTime.now();
threadLocal.set(startTime);
log.debug("任务开始时间已记录:{}", startTime);
}
/**
* 任务执行后置处理方法
* 功能:记录任务结束时间、计算执行耗时、保存执行日志、清理线程本地变量
*
* @param context Quartz任务执行上下文
* @param scheduleJob 定时任务配置信息
* @param exception 执行过程中出现的异常,为null表示执行成功
*/
protected void doAfter(JobExecutionContext context, ScheduleJob scheduleJob, Exception exception) {
// 记录任务结束执行日志
log.info("定时任务执行结束,任务名称:{},任务分组:{}",
scheduleJob.getJobName(), scheduleJob.getJobGroup());
try {
// 1. 构建任务执行日志对象
ScheduleJobLogVO scheduleJobLogVO = buildScheduleJobLogVO(scheduleJob, exception);
// 2. 调用抽象方法保存任务执行日志(由子类实现具体存储逻辑)
boolean saveSuccess = addJobLog(scheduleJobLogVO);
// 3. 记录日志保存结果
if (saveSuccess) {
log.info("任务执行日志保存成功,任务名称:{},任务分组:{},执行状态:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobGroup(),
scheduleJobLogVO.getStatus() == 0 ? "成功" : "失败");
} else {
log.warn("任务执行日志保存失败,任务名称:{},任务分组:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobGroup());
}
} catch (Exception e) {
// 日志保存过程中的异常不应影响主业务流程,仅记录警告日志
log.warn("保存任务执行日志时发生异常,任务名称:{},异常信息:{}",
scheduleJob.getJobName(), e.getMessage(), e);
} finally {
// 确保清理线程本地变量,防止内存泄漏
threadLocal.remove();
log.debug("线程本地变量已清理");
}
}
/**
* 构建任务执行日志对象
* 功能:封装任务执行的详细信息,包括执行时间、耗时、状态等
*
* @param scheduleJob 定时任务配置信息
* @param exception 执行异常,为null表示执行成功
* @return ScheduleJobLogVO 任务执行日志对象
*/
private ScheduleJobLogVO buildScheduleJobLogVO(ScheduleJob scheduleJob, Exception exception) {
ScheduleJobLogVO scheduleJobLogVO = new ScheduleJobLogVO();
// 设置任务基本信息
scheduleJobLogVO.setJobId(scheduleJob.getId());
scheduleJobLogVO.setJobName(scheduleJob.getJobName());
scheduleJobLogVO.setJobGroup(scheduleJob.getJobGroup());
scheduleJobLogVO.setJobTrigger(scheduleJob.getJobTrigger());
scheduleJobLogVO.setCronExpression(scheduleJob.getCronExpression());
// 设置执行时间信息
LocalDateTime startTime = threadLocal.get();
LocalDateTime endTime = LocalDateTime.now();
scheduleJobLogVO.setStartTime(startTime);
scheduleJobLogVO.setEndTime(endTime);
// 计算执行耗时(毫秒)
long consumeTime = ChronoUnit.MILLIS.between(startTime, endTime);
scheduleJobLogVO.setConsumeTime(consumeTime);
// 设置任务执行结果描述
String jobMessage = String.format("%s 执行完成,总耗时:%d 毫秒", scheduleJob.getJobName(), consumeTime);
scheduleJobLogVO.setJobMessage(jobMessage);
// 根据执行结果设置状态和异常信息
if (exception != null) {
// 执行失败:状态设置为1,记录异常信息
scheduleJobLogVO.setStatus(1);
String errorMsg = StringUtils.substring(exception.getMessage(), 0, 2000);
scheduleJobLogVO.setExceptionInfo(errorMsg);
log.debug("任务执行失败,异常信息已记录:{}", errorMsg);
} else {
// 执行成功:状态设置为0
scheduleJobLogVO.setStatus(0);
log.debug("任务执行成功,状态已设置为成功");
}
return scheduleJobLogVO;
}
/**
* 抽象方法:执行具体的业务逻辑
* 功能:由子类实现具体的任务业务逻辑,如数据同步、报表生成等
* 注意:子类实现时应该处理业务异常,避免异常抛出影响框架的日志记录功能
*
* @param context Quartz任务执行上下文,可获取触发器、任务详情等信息
* @param scheduleJob 定时任务配置信息,包含任务参数、执行策略等
* @throws Exception 业务执行过程中可能抛出的异常
*/
protected abstract void doExecute(JobExecutionContext context, ScheduleJob scheduleJob) throws Exception;
/**
* 抽象方法:保存任务执行日志
* 功能:由子类实现具体的日志存储逻辑,如保存到数据库、写入文件等
*
* @param scheduleJobLogVO 任务执行日志对象,包含完整的执行信息
* @return boolean 日志保存是否成功
* true - 保存成功
* false - 保存失败
*/
protected abstract boolean addJobLog(ScheduleJobLogVO scheduleJobLogVO);
}
@@ -0,0 +1,226 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.factory;
import com.xiaomayi.core.utils.SpringUtils;
import com.xiaomayi.scheduler.model.ScheduleJob;
import com.xiaomayi.scheduler.service.JobResolverService;
import com.xiaomayi.scheduler.utils.JobExecuteUtils;
import com.xiaomayi.scheduler.vo.ScheduleJobLogVO;
import lombok.extern.slf4j.Slf4j;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.PersistJobDataAfterExecution;
/**
* <p>
* 同步任务工厂类
* <p>
* 功能说明:
* 1. 继承自 ScheduleJobFactory 抽象基类,实现同步任务的具体执行逻辑
* 2. 采用同步执行方式,确保同一任务在同一时间只能有一个实例在执行
* 3. 通过 Quartz 注解实现任务的串行化执行,保证数据一致性和执行顺序
* <p>
* 关键注解说明:
* - @DisallowConcurrentExecution: 禁止同一任务的并发执行,确保任务串行化
* - @PersistJobDataAfterExecution: 任务执行后持久化JobDataMap中的数据
* <p>
* 适用场景:
* - 数据一致性要求高的任务(如财务对账、库存更新)
* - 需要顺序执行的任务(如数据流水号生成)
* - 资源竞争敏感的任务(如文件锁、数据库锁)
* - 执行时间较长且需要避免重复执行的任务
* <p>
* 注意事项:
* - 同步任务会阻塞后续触发,直到当前执行完成
* - 需要合理设置任务执行超时时间,避免长时间阻塞
* - 适用于执行逻辑复杂、需要保证原子性的业务场景
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
@Slf4j
@PersistJobDataAfterExecution // 确保任务执行后JobDataMap中的数据变更被持久化
@DisallowConcurrentExecution // 禁止同一任务的并发执行,保证任务串行化
public class SyncJobFactory extends ScheduleJobFactory {
/**
* 同步任务执行方法
* <p>
* 功能:执行具体的同步任务业务逻辑,确保同一时间只有一个实例在运行
* 特点:串行执行,当前任务执行完成前,后续触发会被阻塞
* <p>
* 执行流程:
* 1. 记录同步任务开始执行日志
* 2. 通过 JobExecuteUtils 工具类调用任务目标方法
* 3. 任务在当前线程中同步执行,阻塞直到完成
* 4. 记录任务执行完成日志
* <p>
* 并发控制:
* 由于使用了 @DisallowConcurrentExecution 注解,Quartz调度器会确保:
* - 同一任务(相同JobKey)在前一次执行完成前不会启动新的实例
* - 如果任务执行时间超过调度间隔,后续触发会被推迟
* - 保证任务执行的原子性和数据一致性
*
* @param context Quartz任务执行上下文,包含任务触发器、任务详情等信息
* @param scheduleJob 定时任务配置对象,包含任务参数、执行URL等配置信息
* @throws Exception 当任务执行过程中发生异常时抛出,异常会被基类统一处理并记录日志
* @see JobExecuteUtils#invokeMethod(ScheduleJob) 任务方法调用工具类
* @see DisallowConcurrentExecution Quartz禁止并发执行注解
*/
@Override
protected void doExecute(JobExecutionContext context, ScheduleJob scheduleJob) throws Exception {
// 记录同步任务开始执行日志
log.info("开始执行同步任务,任务名称:{},任务ID:{},任务分组:{}",
scheduleJob.getJobName(), scheduleJob.getId(), scheduleJob.getJobGroup());
try {
// 通过工具类执行具体的任务方法
// 由于是同步执行,该方法会阻塞直到任务执行完成
// 在此期间,同一任务的后续触发会被Quartz调度器阻塞
JobExecuteUtils.invokeMethod(scheduleJob);
// 记录任务执行成功日志
log.debug("同步任务执行成功,任务名称:{},任务ID:{}",
scheduleJob.getJobName(), scheduleJob.getId());
} catch (Exception e) {
// 记录任务执行异常日志
log.error("同步任务执行失败,任务名称:{},任务ID:{},异常信息:{}",
scheduleJob.getJobName(), scheduleJob.getId(), e.getMessage(), e);
// 将异常继续抛出,由基类统一处理异常和记录错误日志
throw e;
}
// 记录同步任务执行完成日志
log.info("同步任务执行完成,任务名称:{},任务ID:{}",
scheduleJob.getJobName(), scheduleJob.getId());
}
/**
* 保存任务执行日志
* <p>
* 功能:将任务执行日志持久化到数据库或其他存储介质
* 实现方式:通过 Spring 容器获取 JobResolverService Bean 来执行日志存储操作
* <p>
* 存储内容:
* - 任务基本信息(任务ID、名称、分组、触发器)
* - 执行时间信息(开始时间、结束时间、执行耗时)
* - 执行状态(成功/失败)
* - 异常信息(如果执行失败)
* <p>
* 数据持久化:
* 由于使用了 @PersistJobDataAfterExecution 注解,任务执行过程中对
* JobDataMap 的修改会被自动持久化,可供下一次执行时使用
*
* @param scheduleJobLogVO 任务执行日志值对象,包含完整的任务执行记录信息
* @return boolean 日志保存结果
* true - 日志保存成功
* false - 日志保存失败
* @see JobResolverService#addJobLog(ScheduleJobLogVO) 日志服务接口
* @see SpringUtils#getBean(Class) Spring Bean 获取工具类
* @see PersistJobDataAfterExecution Quartz数据持久化注解
*/
@Override
protected boolean addJobLog(ScheduleJobLogVO scheduleJobLogVO) {
// 记录日志保存开始
log.debug("开始保存同步任务执行日志,任务名称:{},任务ID:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobId());
try {
// 从 Spring 容器中获取任务解析服务 Bean
// 使用依赖查找而非依赖注入,避免循环依赖问题
JobResolverService jobResolverService = SpringUtils.getBean(JobResolverService.class);
// 调用服务方法保存任务执行日志
boolean saveResult = jobResolverService.addJobLog(scheduleJobLogVO);
// 记录日志保存结果
if (saveResult) {
log.debug("同步任务执行日志保存成功,任务名称:{},任务ID:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobId());
} else {
log.warn("同步任务执行日志保存失败,任务名称:{},任务ID:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobId());
}
return saveResult;
} catch (Exception e) {
// 记录日志保存异常
log.error("保存同步任务执行日志时发生异常,任务名称:{},任务ID:{},异常信息:{}",
scheduleJobLogVO.getJobName(), scheduleJobLogVO.getJobId(), e.getMessage(), e);
return false;
}
}
}
@@ -0,0 +1,195 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.model;
import lombok.Data;
/**
* <p>
* 定时任务数据模型类
* 用于封装Quartz定时任务的配置信息和运行时状态
* 对应数据库中的定时任务配置表,是任务调度的核心数据载体
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
@Data
public class ScheduleJob {
/**
* 任务唯一标识ID
* 用途:作为任务的主键,用于唯一标识一个定时任务
* 对应数据库中的主键字段,在任务调度中用于生成JobKey和TriggerKey
* 示例:1001, 1002, 1003
*/
private Integer id;
/**
* 任务名称
* 用途:描述定时任务的功能名称,便于识别和管理
* 示例:"数据同步任务", "报表生成任务", "缓存清理任务"
* 要求:名称应简洁明了,能准确反映任务功能
*/
private String jobName;
/**
* 任务别名
* 用途:任务的备用名称或英文标识,用于代码引用或系统内部识别
* 示例:"data_sync_job", "report_generate_job", "cache_clean_job"
* 注意:别名通常用于程序内部逻辑判断
*/
private String jobAlias;
/**
* 任务分组
* 用途:对定时任务进行分类管理,便于按业务模块或功能分组
* 示例:"SYSTEM_GROUP" - 系统任务组, "BIZ_GROUP" - 业务任务组, "REPORT_GROUP" - 报表任务组
* 作用:在Quartz调度器中实现任务的分组管理和权限控制
*/
private String jobGroup;
/**
* 任务触发器名称
* 用途:存储Quartz生成的触发器唯一标识,用于任务调度管理
* 格式:由ScheduleUtils工具类自动生成,通常为"TASK_CLASS_NAME_" + 任务ID
* 示例:"TASK_CLASS_NAME_1001", "TASK_CLASS_NAME_1002"
* 注意:此字段由系统自动维护,无需手动设置
*/
private String jobTrigger;
/**
* 任务状态
* 用途:标识定时任务的当前运行状态
* 取值说明:
* 0 - 未发布:任务已创建但未提交到调度器
* 1 - 运行中:任务正在按照调度计划正常执行
* 2 - 暂停:任务已暂停,不会触发执行但配置保留
* 注意:状态变更会影响任务的实际调度行为
*/
private Integer status;
/**
* Cron表达式
* 用途:定义定时任务的执行时间规则,使用标准的Cron表达式语法
* 格式说明:[秒] [分] [时] [日] [月] [周] [年](年可选)
* 常用示例:
* "0 0 2 * * ?" - 每天凌晨2点执行
* "0 0/5 * * * ?" - 每5分钟执行一次
* "0 0 12 ? * MON-FRI" - 每周一到周五中午12点执行
* 验证:表达式必须符合Quartz Cron语法规范
*/
private String cronExpression;
/**
* 执行策略
* 用途:定义当任务执行时间到达但上一次执行尚未完成时的处理策略
* 取值说明:
* 1 - 立即执行:忽略上一次执行,立即开始新的执行(可能并发)
* 2 - 执行一次:等待上一次执行完成后再执行一次(串行)
* 3 - 放弃执行:跳过本次执行,等待下一次调度时间
* 应用场景:用于控制长时间运行任务的并发行为
*/
private Integer executePolicy;
/**
* 是否同步任务
* 用途:标识任务执行时是否采用同步方式
* 取值说明:
* 0 - 异步任务:任务在后台线程执行,不阻塞主线程
* 1 - 同步任务:任务在当前线程执行,会阻塞直到完成
* 影响:同步任务适用于需要立即返回结果的场景,异步任务适用于后台处理
*/
private Integer isSync;
/**
* 任务执行URL
* 用途:当任务类型为HTTP任务时,指定要调用的接口地址
* 格式:完整的HTTP/HTTPS URL地址
* 示例:
* "http://api.example.com/data/sync"
* "/api/internal/task/execute"
* 注意:对于非HTTP任务,此字段可为空或存储其他执行标识
*/
private String url;
/**
* 任务备注信息
* 用途:存储任务的详细描述、配置说明、注意事项等辅助信息
* 内容示例:
* "每月1号凌晨执行财务报表生成,涉及销售数据和成本数据统计"
* "重要:此任务执行期间会锁定相关数据表,请避开业务高峰期"
* 作用:便于任务维护人员理解任务背景和特殊要求
*/
private String note;
}
@@ -0,0 +1,141 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.service;
import com.xiaomayi.scheduler.vo.ScheduleJobLogVO;
/**
* <p>
* 任务调度解析服务接口
* <p>
* 功能定位:
* 1. 作为任务调度模块的核心服务接口,负责处理任务执行过程中的业务逻辑
* 2. 提供任务执行日志的持久化能力,支持任务执行状态的追踪和分析
* 3. 为不同的任务执行工厂(AsyncJobFactory/SyncJobFactory)提供统一的日志服务
* <p>
* 设计原则:
* - 单一职责原则:专注于任务执行相关的业务处理
* - 接口隔离原则:提供最小化的接口方法,便于实现和扩展
* - 依赖倒置原则:抽象与具体实现分离,提高系统灵活性
* <p>
* 使用场景:
* - 定时任务执行完成后记录执行日志
* - 任务执行失败时记录异常信息
* - 提供任务执行历史查询的数据支撑
* - 支持任务执行统计和分析
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
public interface JobResolverService {
/**
* 添加任务调度执行日志
* <p>
* 功能说明:
* 将定时任务的执行记录持久化到存储系统(如数据库),用于后续的监控、统计和问题排查。
* 该方法由任务调度框架在任务执行完成后自动调用,无论是成功还是失败都会记录。
* <p>
* 日志内容包含:
* - 任务基本信息:任务ID、名称、分组、触发器
* - 执行时间信息:开始时间、结束时间、执行耗时
* - 执行结果状态:成功(0) / 失败(1)
* - 异常信息:执行失败时的错误信息和堆栈跟踪(截取前2000字符)
* - 执行消息:任务执行的详细描述信息
* <p>
* 业务价值:
* 1. 运维监控:实时掌握任务执行状态和系统健康度
* 2. 问题排查:通过执行历史快速定位任务失败原因
* 3. 性能分析:统计任务执行耗时,优化系统性能
* 4. 审计追踪:满足合规性要求,记录系统操作历史
* <p>
* 实现要求:
* - 实现类应确保日志记录的原子性,要么全部成功要么全部失败
* - 在高并发场景下需要考虑性能优化,如批量插入、异步处理等
* - 应具备适当的异常处理机制,避免日志记录失败影响主业务流程
*
* @param scheduleJobLogVO 任务执行日志值对象,包含完整的任务执行记录信息
* - 不能为 null,否则可能抛出空指针异常
* - 应包含完整的任务执行上下文信息
* @return boolean 日志保存结果
* true - 日志保存成功,表示执行记录已持久化到存储系统
* false - 日志保存失败,可能原因包括:数据库连接异常、数据验证失败、系统异常等
* @throws IllegalArgumentException 当参数 scheduleJobLogVO 为 null 或包含无效数据时
* @throws RuntimeException 当底层持久化操作发生不可恢复的异常时
* @see ScheduleJobLogVO 任务执行日志值对象定义
* @see com.xiaomayi.scheduler.factory.AsyncJobFactory 异步任务工厂
* @see com.xiaomayi.scheduler.factory.SyncJobFactory 同步任务工厂
*/
boolean addJobLog(ScheduleJobLogVO scheduleJobLogVO);
}
@@ -0,0 +1,272 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.utils;
import cn.hutool.extra.spring.SpringUtil;
import com.xiaomayi.core.utils.StringUtils;
import com.xiaomayi.scheduler.model.ScheduleJob;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
/**
* <p>
* 定时任务调度执行工具类
* 提供定时任务方法的动态调用功能,支持从Spring容器获取Bean或直接实例化类来执行目标方法
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
public class JobExecuteUtils {
/**
* 执行定时任务方法
* 根据任务配置的目标字符串动态调用相应的方法
* 支持格式:beanName.methodName(参数1,参数2,...) 或 className.methodName(参数1,参数2,...)
*
* @param scheduleJob 定时任务对象,包含任务执行的目标信息
* @throws Exception 当方法调用过程中发生异常时抛出,包括反射异常、实例化异常等
*/
public static void invokeMethod(ScheduleJob scheduleJob) throws Exception {
// 获取任务执行目标字符串,格式如:userService.getUserList('admin', 123) 或 com.example.UserService.getUserList('admin', 123)
String invokeTarget = scheduleJob.getUrl();
// 解析目标字符串获取Bean/类名
String beanName = getBeanName(invokeTarget);
// 解析目标字符串获取方法名
String methodName = getMethodName(invokeTarget);
// 解析目标字符串获取方法参数列表
List<Object[]> methodParams = getMethodParams(invokeTarget);
// 判断目标是Spring Bean还是完整的类名
if (!isValidClassName(beanName)) {
// 从Spring容器中获取Bean实例
Object bean = SpringUtil.getBean(beanName);
// 调用目标方法
invokeMethod(bean, methodName, methodParams);
} else {
// 通过反射实例化类对象
Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
// 调用目标方法
invokeMethod(bean, methodName, methodParams);
}
}
/**
* 通过反射调用目标对象的方法
*
* @param bean 目标对象实例
* @param methodName 要调用的方法名称
* @param methodParams 方法参数列表,每个Object[]包含参数值和参数类型
* @throws NoSuchMethodException 当找不到指定方法时抛出
* @throws SecurityException 当安全管理器拒绝访问时抛出
* @throws IllegalAccessException 当方法访问权限不足时抛出
* @throws IllegalArgumentException 当参数不匹配时抛出
* @throws InvocationTargetException 当被调用方法本身抛出异常时抛出
*/
private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
InvocationTargetException {
if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) {
// 有参数的方法调用:获取参数类型数组,通过反射获取方法对象,传入参数值调用方法
Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams));
method.invoke(bean, getMethodParamsValue(methodParams));
} else {
// 无参数的方法调用:直接获取无参方法并调用
Method method = bean.getClass().getMethod(methodName);
method.invoke(bean);
}
}
/**
* 校验字符串是否为有效的类全限定名
* 判断标准:包含多于一个点号(.)视为类名,否则视为Spring Bean名称
*
* @param invokeTarget 待校验的字符串
* @return true-是类名,false-是Bean名
*/
public static boolean isValidClassName(String invokeTarget) {
return StringUtils.countMatches(invokeTarget, ".") > 1;
}
/**
* 从目标字符串中解析出Bean名称或类名
* 目标字符串格式:beanName.methodName(参数) 或 className.methodName(参数)
*
* @param invokeTarget 目标字符串
* @return Bean名称或类全限定名
*/
public static String getBeanName(String invokeTarget) {
// 先截取括号前的部分:beanName.methodName
String beanName = StringUtils.substringBefore(invokeTarget, "(");
// 再截取最后一个点号前的部分:beanName
return StringUtils.substringBeforeLast(beanName, ".");
}
/**
* 从目标字符串中解析出方法名称
* 目标字符串格式:beanName.methodName(参数) 或 className.methodName(参数)
*
* @param invokeTarget 目标字符串
* @return 方法名称
*/
public static String getMethodName(String invokeTarget) {
// 先截取括号前的部分:beanName.methodName
String methodName = StringUtils.substringBefore(invokeTarget, "(");
// 再截取最后一个点号后的部分:methodName
return StringUtils.substringAfterLast(methodName, ".");
}
/**
* 从目标字符串中解析方法参数列表
* 支持解析字符串、布尔值、长整型、双精度浮点型和整型参数
* 参数格式示例:('字符串参数', true, 123L, 45.67D, 89)
*
* @param invokeTarget 目标字符串
* @return 参数列表,每个Object[]包含两个元素:[参数值, 参数类型Class]
* 返回null表示无参数
*/
public static List<Object[]> getMethodParams(String invokeTarget) {
// 提取括号内的参数部分
String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
if (StringUtils.isEmpty(methodStr)) {
return null;
}
// 使用正则表达式分割参数,考虑字符串中包含逗号的情况
// (?=([^"']*["'][^"']*["'])*[^"']*$) 确保不分割引号内的逗号
String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)");
List<Object[]> classs = new LinkedList<>();
for (int i = 0; i < methodParams.length; i++) {
String str = StringUtils.trimToEmpty(methodParams[i]);
// 字符串类型:以单引号或双引号开头
if (StringUtils.startsWithAny(str, "'", "\"")) {
classs.add(new Object[]{StringUtils.substring(str, 1, str.length() - 1), String.class});
}
// 布尔类型:值为true或false(不区分大小写)
else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) {
classs.add(new Object[]{Boolean.valueOf(str), Boolean.class});
}
// 长整型:以L结尾
else if (StringUtils.endsWith(str, "L")) {
classs.add(new Object[]{Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class});
}
// 双精度浮点型:以D结尾
else if (StringUtils.endsWith(str, "D")) {
classs.add(new Object[]{Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class});
}
// 默认处理为整型
else {
classs.add(new Object[]{Integer.valueOf(str), Integer.class});
}
}
return classs;
}
/**
* 从参数列表中提取参数类型数组
*
* @param methodParams 参数列表,每个Object[]格式为[参数值, 参数类型Class]
* @return 参数类型Class数组
*/
public static Class<?>[] getMethodParamsType(List<Object[]> methodParams) {
Class<?>[] classs = new Class<?>[methodParams.size()];
int index = 0;
for (Object[] os : methodParams) {
classs[index] = (Class<?>) os[1];
index++;
}
return classs;
}
/**
* 从参数列表中提取参数值数组
*
* @param methodParams 参数列表,每个Object[]格式为[参数值, 参数类型Class]
* @return 参数值数组
*/
public static Object[] getMethodParamsValue(List<Object[]> methodParams) {
Object[] classs = new Object[methodParams.size()];
int index = 0;
for (Object[] os : methodParams) {
classs[index] = (Object) os[0];
index++;
}
return classs;
}
}
@@ -0,0 +1,376 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.utils;
import com.xiaomayi.scheduler.constant.ScheduleConstant;
import com.xiaomayi.scheduler.exception.ScheduleException;
import com.xiaomayi.scheduler.factory.AsyncJobFactory;
import com.xiaomayi.scheduler.factory.SyncJobFactory;
import com.xiaomayi.scheduler.model.ScheduleJob;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
/**
* <p>
* 定时任务调度工具类
* 提供Quartz定时任务的创建、更新、删除、暂停、恢复等操作工具方法
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
@Slf4j
public class ScheduleUtils {
/**
* 获取触发器KEY
* 触发器命名规则:TASK_CLASS_NAME + jobId
*
* @param jobId 任务ID
* @param jobGroup 任务分组
* @return TriggerKey 触发器键
*/
public static TriggerKey getTriggerKey(Integer jobId, String jobGroup) {
String triggerName = ScheduleConstant.TASK_CLASS_NAME + jobId;
return TriggerKey.triggerKey(triggerName, jobGroup);
}
/**
* 获取任务KEY
* 任务命名规则:TASK_CLASS_NAME + 格式化后的jobId(5位数字,不足补0)
*
* @param jobId 任务ID
* @param jobGroup 任务分组
* @return JobKey 任务键
*/
public static JobKey getJobKey(Integer jobId, String jobGroup) {
// 将任务ID格式化为5位数字,不足前面补0,确保任务名称的唯一性和规范性
String jobKeyId = String.format("%05d", jobId);
String jobName = ScheduleConstant.TASK_CLASS_NAME + jobKeyId;
log.debug("生成任务KEY:任务名称={},任务分组={}", jobName, jobGroup);
return JobKey.jobKey(jobName, jobGroup);
}
/**
* 获取表达式触发器
*
* @param scheduler Quartz调度器实例
* @param jobId 任务ID
* @param jobGroup 任务分组
* @return CronTrigger Cron表达式触发器
* @throws ScheduleException 当获取触发器失败时抛出
*/
public static CronTrigger getCronTrigger(Scheduler scheduler, Integer jobId, String jobGroup) {
try {
TriggerKey triggerKey = getTriggerKey(jobId, jobGroup);
return (CronTrigger) scheduler.getTrigger(triggerKey);
} catch (SchedulerException e) {
log.error("获取定时任务CronTrigger出现异常,任务ID:{},任务分组:{}", jobId, jobGroup, e);
throw new ScheduleException("获取定时任务CronTrigger出现异常");
}
}
/**
* 创建定时任务(基于ScheduleJob对象)
*
* @param scheduler Quartz调度器实例
* @param scheduleJob 定时任务配置对象
* @throws ScheduleException 当创建任务失败时抛出
*/
public static void createScheduleJob(Scheduler scheduler, ScheduleJob scheduleJob) {
createScheduleJob(scheduler,
scheduleJob.getId(),
scheduleJob.getJobGroup(),
scheduleJob.getCronExpression(),
scheduleJob.getIsSync(),
scheduleJob);
}
/**
* 创建定时任务(基于参数)
*
* @param scheduler Quartz调度器实例
* @param jobId 任务ID
* @param jobGroup 任务分组
* @param cronExpression Cron表达式,定义任务执行时间规则
* @param isSync 是否同步执行:1-同步 0-异步
* @param param 任务参数,会传递给Job执行时使用
* @throws ScheduleException 当创建任务失败时抛出
*/
public static void createScheduleJob(Scheduler scheduler, Integer jobId, String jobGroup,
String cronExpression, Integer isSync, Object param) {
try {
// 根据同步/异步标识选择对应的Job工厂类
Class<? extends Job> jobClass = isSync.equals(1) ? SyncJobFactory.class : AsyncJobFactory.class;
log.info("创建{}定时任务,任务ID:{},任务分组:{},Cron表达式:{}",
isSync.equals(1) ? "同步" : "异步", jobId, jobGroup, cronExpression);
// 1. 构建JobDetail(任务详情)
JobDetail jobDetail = JobBuilder.newJob(jobClass)
.withIdentity(getJobKey(jobId, jobGroup))
.build();
// 2. 构建CronScheduleBuilder(Cron调度构建器)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
// 3. 构建CronTrigger(Cron触发器)
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(getTriggerKey(jobId, jobGroup))
.withSchedule(scheduleBuilder)
.build();
// 4. 设置任务触发器信息到参数对象中
String jobTrigger = trigger.getKey().getName();
if (param instanceof ScheduleJob scheduleJob) {
scheduleJob.setJobTrigger(jobTrigger);
}
// 5. 将任务参数放入JobDataMap,供Job执行时获取
jobDetail.getJobDataMap().put(ScheduleConstant.TASK_SCHEDULE_PARAM, param);
// 6. 调度任务
scheduler.scheduleJob(jobDetail, trigger);
log.info("定时任务创建成功,任务ID:{},任务分组:{}", jobId, jobGroup);
} catch (SchedulerException e) {
log.error("创建定时任务失败,任务ID:{},任务分组:{}", jobId, jobGroup, e);
throw new ScheduleException("创建定时任务失败");
}
}
/**
* 立即运行一次任务
* 注意:此方法只触发任务立即执行一次,不影响原有的调度计划
*
* @param scheduler Quartz调度器实例
* @param jobId 任务ID
* @param jobGroup 任务分组
* @throws ScheduleException 当触发任务失败时抛出
*/
public static void runOnce(Scheduler scheduler, Integer jobId, String jobGroup) {
JobKey jobKey = getJobKey(jobId, jobGroup);
try {
log.info("立即执行定时任务,任务ID:{},任务分组:{}", jobId, jobGroup);
scheduler.triggerJob(jobKey);
} catch (SchedulerException e) {
log.error("立即执行定时任务失败,任务ID:{},任务分组:{}", jobId, jobGroup, e);
throw new ScheduleException("立即执行定时任务失败");
}
}
/**
* 暂停定时任务
* 暂停后任务将不再触发执行,但任务配置仍然保留
*
* @param scheduler Quartz调度器实例
* @param jobId 任务ID
* @param jobGroup 任务分组
* @throws ScheduleException 当暂停任务失败时抛出
*/
public static void pauseJob(Scheduler scheduler, Integer jobId, String jobGroup) {
JobKey jobKey = getJobKey(jobId, jobGroup);
try {
log.info("暂停定时任务,任务ID:{},任务分组:{}", jobId, jobGroup);
scheduler.pauseJob(jobKey);
} catch (SchedulerException e) {
log.error("暂停定时任务失败,任务ID:{},任务分组:{}", jobId, jobGroup, e);
throw new ScheduleException("暂停定时任务失败");
}
}
/**
* 恢复定时任务
* 将暂停的任务重新激活,按照原有的调度计划继续执行
*
* @param scheduler Quartz调度器实例
* @param jobId 任务ID
* @param jobGroup 任务分组
* @throws ScheduleException 当恢复任务失败时抛出
*/
public static void resumeJob(Scheduler scheduler, Integer jobId, String jobGroup) {
JobKey jobKey = getJobKey(jobId, jobGroup);
try {
log.info("恢复定时任务,任务ID:{},任务分组:{}", jobId, jobGroup);
scheduler.resumeJob(jobKey);
} catch (SchedulerException e) {
log.error("恢复定时任务失败,任务ID:{},任务分组:{}", jobId, jobGroup, e);
throw new ScheduleException("恢复定时任务失败");
}
}
/**
* 更新定时任务(基于ScheduleJob对象)
* 主要更新Cron表达式,其他配置保持不变
*
* @param scheduler Quartz调度器实例
* @param scheduleJob 定时任务配置对象
* @throws ScheduleException 当更新任务失败时抛出
*/
public static void updateScheduleJob(Scheduler scheduler, ScheduleJob scheduleJob) {
updateScheduleJob(scheduler,
scheduleJob.getId(),
scheduleJob.getJobGroup(),
scheduleJob.getCronExpression(),
scheduleJob.getIsSync(),
scheduleJob);
}
/**
* 更新定时任务(基于参数)
* 主要更新触发器的Cron表达式,解决集群环境中状态同步问题
*
* @param scheduler Quartz调度器实例
* @param jobId 任务ID
* @param jobGroup 任务分组
* @param cronExpression 新的Cron表达式
* @param isSync 是否同步执行(此参数在当前实现中未使用,保留为了接口一致性)
* @param param 任务参数(此参数在当前实现中未使用,保留为了接口一致性)
* @throws ScheduleException 当更新任务失败时抛出
*/
public static void updateScheduleJob(Scheduler scheduler, Integer jobId, String jobGroup,
String cronExpression, Integer isSync, Object param) {
try {
log.info("更新定时任务,任务ID:{},任务分组:{},新的Cron表达式:{}", jobId, jobGroup, cronExpression);
TriggerKey triggerKey = getTriggerKey(jobId, jobGroup);
// 1. 构建新的Cron调度器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
// 2. 获取原有的触发器
CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 3. 基于原有触发器构建新的触发器(只更新调度表达式)
CronTrigger newTrigger = oldTrigger.getTriggerBuilder()
.withIdentity(triggerKey)
.withSchedule(scheduleBuilder)
.build();
// 4. 检查触发器当前状态
Trigger.TriggerState triggerState = scheduler.getTriggerState(triggerKey);
// 5. 忽略状态为PAUSED的任务,解决集群环境中状态同步问题
// 在集群环境下,如果任务在其他节点被暂停,在当前节点更新时不应该重新激活任务
if (!triggerState.name().equalsIgnoreCase("PAUSED")) {
scheduler.rescheduleJob(triggerKey, newTrigger);
log.info("定时任务更新成功,任务ID:{},任务分组:{}", jobId, jobGroup);
} else {
log.warn("定时任务处于暂停状态,跳过更新操作,任务ID:{},任务分组:{}", jobId, jobGroup);
}
} catch (SchedulerException e) {
log.error("更新定时任务失败,任务ID:{},任务分组:{}", jobId, jobGroup, e);
throw new ScheduleException("更新定时任务失败");
}
}
/**
* 删除定时任务
* 删除后任务将完全移除,包括任务配置和执行历史
*
* @param scheduler Quartz调度器实例
* @param jobId 任务ID
* @param jobGroup 任务分组
* @throws ScheduleException 当删除任务失败时抛出
*/
public static void deleteScheduleJob(Scheduler scheduler, Integer jobId, String jobGroup) {
try {
JobKey jobKey = getJobKey(jobId, jobGroup);
log.info("删除定时任务,任务ID:{},任务分组:{}", jobId, jobGroup);
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
log.error("删除定时任务失败,任务ID:{},任务分组:{}", jobId, jobGroup, e);
throw new ScheduleException("删除定时任务失败");
}
}
/**
* 检查定时任务是否存在
*
* @param scheduler Quartz调度器实例
* @param jobId 任务ID
* @param jobGroup 任务分组
* @return boolean true-存在 false-不存在
* @throws ScheduleException 当检查任务存在状态失败时抛出
*/
public static boolean checkExists(Scheduler scheduler, Integer jobId, String jobGroup) {
try {
JobKey jobKey = getJobKey(jobId, jobGroup);
boolean exists = scheduler.checkExists(jobKey);
log.debug("检查定时任务是否存在,任务ID:{},任务分组:{},结果:{}", jobId, jobGroup, exists);
return exists;
} catch (SchedulerException e) {
log.error("检查定时任务是否存在失败,任务ID:{},任务分组:{}", jobId, jobGroup, e);
throw new ScheduleException("检查定时任务是否存在失败");
}
}
}
@@ -0,0 +1,148 @@
// +======================================================================
// | 小蚂蚁云·企业数字化开发平台 [ 加速数字化转型,构建智能未来 ]
// +----------------------------------------------------------------------
// | 核心价值:赋能开发者 · 服务企业 · 共建生态
// +----------------------------------------------------------------------
// | Copyright (c) 2020-2026 小蚂蚁云团队 版权所有
// +----------------------------------------------------------------------
// | 官方平台: https://www.xiaomayicloud.com
// +======================================================================
// | 【知识产权声明】
// | 1. 权属声明:本软件是受《中华人民共和国著作权法》
// | 保护的专有财产,完整版权归小蚂蚁云团队所有
// | 2. 权利范围:所有知识产权(商标、专利、著作权、
// | 商业秘密等)均归小蚂蚁云团队所有,受法律保护
// | 3. 授权性质:用户仅可获得有限的、非独占的使用许可
// | 4. 禁止行为:未经书面授权,禁止对本软件本身
// | 申请任何知识产权
// | 5. 权利保留:未在本协议中明示授予的一切权利
// | 均由小蚂蚁云团队保留
// +======================================================================
// | 【授权状态说明】
// | 1. 未授权状态:用户未购买有效的商业许可证
// | 2. 商业授权:已购买正式商业许可证的用户
// +======================================================================
// | 【绝对禁止条款】
// | 无论授权状态如何,任何用户均严格禁止以下行为:
// | 1. 逆向工程:对软件进行反编译、反汇编、技术破解或任何形式的逆向分析
// | 2. 版权破坏:移除、修改、遮挡软件中的版权标识、许可控制或技术保护措施
// | 3. 非法传播:复制、分发、出租、出借、转售、再许可本软件或其许可权利
// | 4. 竞争性使用:利用本软件的代码、架构、设计开发直接竞争的产品或服务
// | 5. 侵权使用:将软件用于侵犯第三方知识产权或其他合法权益的用途
// +======================================================================
// | 【商业授权许可范围】
// | 购买有效商业许可证的用户,在遵守上述禁止条款的前提下,获得:
// | 1. 使用权利:在许可证约定的项目数量、开发者数量范围内使用本软件
// | 2. 技术支持:商业授权用户可以获取本地开发部署的技术支持服务
// | 3. 版本更新:在许可证有效期内获取软件更新、安全补丁和功能增强
// | 4. 商业部署:将基于本软件开发的应用程序用于商业运营和生产环境
// +======================================================================
// | 【许可证获取】
// | 1. 获取途径:仅通过小蚂蚁云官方渠道购买(官网、授权代理商),购买记录凭证
// | 2. 转让限制:许可证与购买主体绑定,未经书面同意不得转让
// | 3. 终止情形:许可证到期、违反协议、破产清算等情况下自动终止
// +======================================================================
// | 【合法使用要求】
// | 1. 仅限用于合法合规的软件研发
// | 2. 严禁用于任何违法、侵权或恶意行为
// | 3. 严禁违反我国法律法规和政策
// +======================================================================
// | 【免责声明】
// | 因使用本框架导致的以下情况,我们概不负责:
// | 1. 项目研发中的意外、疏忽、违约等风险
// | 2. 侵犯第三方知识产权或其他合法权益
// | 3. 任何直接、间接、附带或衍生一切损失
// | 4. 用户违规违法行为的一切法律后果
// +======================================================================
// | 【协议重要提示】
// | 1. 本声明是《小蚂蚁云最终用户许可协议》的摘要版本
// | 2. 下载、安装或使用本软件即表示您接受全部协议条款
// | 3. 我们保留单方面修改本声明的权利,修改后的版本在官网公布即生效
// | 4. 用户有义务定期查看最新版本,继续使用视为接受修改
// +======================================================================
// | 【侵权举报与合规】
// | 1. 知识产权侵权举报:请联系官方客服
// | 2. 许可证合规咨询:xiaomayicloud@163.com
// | 3. 违规使用将终止授权并追究责任
// | 4. 无条件配合司法机关调查取证
// | 5. 保留一切法律追诉权利
// | 6. 对有效举报和合规建议,我们将给予感谢和奖励
// +======================================================================
package com.xiaomayi.scheduler.vo;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
/**
* <p>
* 定时任务调度日志VO
* </p>
*
* @author 小蚂蚁云团队
* @since 2024-06-13
*/
@Data
public class ScheduleJobLogVO {
/**
* 任务ID
*/
private Integer jobId;
/**
* 任务名称
*/
private String jobName;
/**
* 任务分组
*/
private String jobGroup;
/**
* 任务触发器
*/
private String jobTrigger;
/**
* 日志信息
*/
private String jobMessage;
/**
* 正则表达式
*/
private String cronExpression;
/**
* 执行状态:0-正常 1-失败
*/
private Integer status;
/**
* 开始时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
/**
* 结束时间
*/
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
/**
* 执行耗时,单位:毫秒
*/
private Long consumeTime;
/**
* 异常信息
*/
private String exceptionInfo;
}