开源字节/source-vue的定时任务模块

开源字节/source-vue的定时任务模块

【免费下载链接】source-vue 🔥 一直想做一款追求极致用户体验的快速开发平台,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间对若依框架进行扩展写了一套快速开发系统。如此有了开源字节快速开发平台。该平台基于 Spring Boot + MyBatis + Vue & Element ,包含微信小程序 & Uniapp, Web 报表、可视化大屏、三方登录、支付、短信、邮件、OSS... 【免费下载链接】source-vue 项目地址: https://gitcode.com/open-source-byte/source-vue

文章详细介绍了开源字节/source-vue项目中定时任务模块的设计与实现,重点分析了SysJob和SysJobLog两个核心实体类的设计,以及Quartz框架的集成与任务调度功能。文章还深入探讨了任务执行与日志记录的实现细节,以及任务异常处理的机制。

SysJob与SysJobLog设计

在开源字节/source-vue的定时任务模块中,SysJobSysJobLog是两个核心实体类,分别用于描述定时任务的配置信息和执行日志记录。以下是对这两个类的详细设计分析。

1. SysJob设计

SysJob类用于定义定时任务的基本属性和行为,其设计如下:

public class SysJob extends BaseEntity {
    private Long jobId; // 任务ID
    private String jobName; // 任务名称
    private String jobGroup; // 任务组名
    private String invokeTarget; // 调用目标字符串
    private String cronExpression; // Cron表达式
    private Date nextValidTime; // 下次执行时间
    private String misfirePolicy; // 计划执行错误策略
    private String concurrent; // 是否并发执行
    private String status; // 任务状态
}
关键字段说明
  • jobId: 任务的唯一标识。
  • jobNamejobGroup: 用于区分任务和任务组。
  • invokeTarget: 指定任务调用的目标方法或服务。
  • cronExpression: 定义任务的执行时间规则。
  • misfirePolicy: 处理任务执行失败时的策略。
  • status: 任务状态(如运行、暂停等)。
示例

以下是一个SysJob对象的JSON表示:

{
  "jobId": 1,
  "jobName": "数据备份任务",
  "jobGroup": "system",
  "invokeTarget": "backupService.backupData()",
  "cronExpression": "0 0 2 * * ?",
  "misfirePolicy": "3",
  "concurrent": "0",
  "status": "0"
}

2. SysJobLog设计

SysJobLog类用于记录定时任务的执行日志,其设计如下:

public class SysJobLog extends BaseEntity {
    private Long jobLogId; // 日志ID
    private String jobName; // 任务名称
    private String jobGroup; // 任务组名
    private String invokeTarget; // 调用目标字符串
    private String jobMessage; // 日志信息
    private String status; // 执行状态
    private String exceptionInfo; // 异常信息
    private Date startTime; // 开始时间
    private Date stopTime; // 结束时间
}
关键字段说明
  • jobLogId: 日志的唯一标识。
  • jobNamejobGroup: 关联到对应的任务。
  • jobMessage: 记录任务的执行详情。
  • status: 执行状态(成功或失败)。
  • exceptionInfo: 任务执行失败时的异常信息。
示例

以下是一个SysJobLog对象的JSON表示:

{
  "jobLogId": 1,
  "jobName": "数据备份任务",
  "jobGroup": "system",
  "invokeTarget": "backupService.backupData()",
  "jobMessage": "数据备份成功",
  "status": "0",
  "exceptionInfo": "",
  "startTime": "2025-08-18T02:00:00",
  "stopTime": "2025-08-18T02:05:00"
}

3. 类关系图

以下是SysJobSysJobLog的关系图:

mermaid

4. 功能流程

定时任务的执行流程如下:

  1. 任务调度SysJob配置的任务通过ScheduleUtils类被调度执行。
  2. 日志记录:任务执行过程中,SysJobLog记录执行状态和结果。
  3. 异常处理:若任务执行失败,exceptionInfo字段记录异常信息。

mermaid

5. 总结

SysJobSysJobLog的设计充分体现了定时任务模块的灵活性和可扩展性。通过SysJob配置任务,SysJobLog记录执行详情,开发者可以轻松管理和监控系统中的定时任务。

Quartz集成与任务调度

在开源字节的source-vue项目中,定时任务模块通过集成Quartz框架实现了灵活的任务调度功能。Quartz是一个功能强大且易于使用的开源任务调度库,支持复杂的调度需求,如定时执行、任务持久化以及集群环境下的任务协调。本节将详细介绍Quartz在项目中的集成方式、核心功能实现以及任务调度的最佳实践。

Quartz的核心组件

Quartz的核心组件包括SchedulerJobTriggerJobDetail。在source-vue中,这些组件通过以下类实现:

  1. Scheduler
    ScheduleConfig类配置,负责管理任务的启动、暂停和停止。

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(dataSource);
        return factory;
    }
    
  2. Job
    通过继承AbstractQuartzJob实现任务逻辑,例如QuartzDisallowConcurrentExecutionQuartzJobExecution

    public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob {
        @Override
        public void execute(JobExecutionContext context) {
            // 任务逻辑
        }
    }
    
  3. Trigger
    使用CronTrigger定义任务的执行时间,通过ScheduleUtils类动态创建和管理触发器。

    public static void createScheduleJob(Scheduler scheduler, SysJob job) {
        // 创建触发器逻辑
    }
    
  4. JobDetail
    封装任务的具体信息,如任务名称、组别和调用目标。

任务调度的实现流程

  1. 任务定义与持久化
    任务信息存储在SysJob表中,包括任务名称、调用目标、Cron表达式等字段。

    public class SysJob {
        private Long jobId;
        private String jobName;
        private String invokeTarget;
        private String cronExpression;
        // 其他字段
    }
    
  2. 任务调度与执行
    通过ScheduleUtils类动态创建任务并注册到Scheduler中。
    mermaid

  3. 任务日志记录
    任务执行结果记录在SysJobLog表中,便于监控和排查问题。

    public class SysJobLog {
        private Long jobLogId;
        private String jobName;
        private String status;
        private String exceptionInfo;
        // 其他字段
    }
    

任务调度的最佳实践

  1. 避免并发执行
    通过QuartzDisallowConcurrentExecution类确保同一任务不会并发执行。

    public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob {
        // 实现逻辑
    }
    
  2. 动态任务管理
    支持通过接口动态添加、修改和删除任务,例如:

    @PostMapping
    public AjaxResult add(@RequestBody SysJob job) {
        // 添加任务逻辑
    }
    
  3. 任务监控与日志
    提供任务执行日志查询和清理功能,便于运维管理。

    @DeleteMapping("/clean")
    public AjaxResult clean() {
        // 清理日志逻辑
    }
    

通过以上设计和实现,source-vue的定时任务模块不仅满足了业务需求,还提供了高可用性和灵活性。

任务执行与日志记录

在开源字节/source-vue的定时任务模块中,任务执行与日志记录是核心功能之一。通过任务执行,系统能够按照预定的时间规则自动触发任务,而日志记录则确保了任务执行过程的透明性和可追溯性。以下将详细介绍这两个功能的实现细节。

任务执行

任务执行的核心逻辑由ScheduleUtilsJobInvokeUtil两个工具类实现。ScheduleUtils负责与Quartz调度器交互,管理任务的创建、暂停、恢复和删除;JobInvokeUtil则负责动态调用任务目标方法。

任务调度流程

mermaid

关键代码示例
  1. 任务触发

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void run(SysJob job) {
        Long jobId = job.getJobId();
        String jobGroup = job.getJobGroup();
        JobDataMap dataMap = new JobDataMap();
        dataMap.put(ScheduleConstants.TASK_PROPERTIES, job);
        scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, jobGroup), dataMap);
    }
    
  2. 动态方法调用

    public static void invokeMethod(SysJob sysJob) {
        String invokeTarget = sysJob.getInvokeTarget();
        String beanName = getBeanName(invokeTarget);
        String methodName = getMethodName(invokeTarget);
        Object bean = SpringUtils.getBean(beanName);
        Method method = bean.getClass().getMethod(methodName);
        method.invoke(bean);
    }
    

日志记录

日志记录功能由SysJobLog实体类、ISysJobLogService接口及其实现类SysJobLogServiceImpl共同完成。日志记录了任务的执行状态、执行时间、异常信息等关键数据。

日志记录流程

mermaid

关键代码示例
  1. 日志实体类

    public class SysJobLog extends BaseEntity {
        private Long jobLogId;
        private String jobName;
        private String jobGroup;
        private String invokeTarget;
        private String jobMessage;
        private String status;
        private String exceptionInfo;
        private Date startTime;
        private Date stopTime;
    }
    
  2. 日志服务实现

    @Override
    public void addJobLog(SysJobLog jobLog) {
        jobLogMapper.insertJobLog(jobLog);
    }
    
  3. 日志清理

    @Override
    public void cleanJobLog() {
        jobLogMapper.cleanJobLog();
    }
    

任务与日志的关联

任务执行过程中,日志记录会自动关联到任务ID和任务组,确保每条日志都能追溯到具体的任务。日志记录的创建和更新由AbstractQuartzJob类统一管理。

关联示例
@Override
public void execute(JobExecutionContext context) {
    SysJob sysJob = (SysJob) context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES);
    SysJobLog sysJobLog = new SysJobLog();
    sysJobLog.setJobName(sysJob.getJobName());
    sysJobLog.setJobGroup(sysJob.getJobGroup());
    sysJobLog.setInvokeTarget(sysJob.getInvokeTarget());
    sysJobLog.setStartTime(new Date());
    try {
        JobInvokeUtil.invokeMethod(sysJob);
        sysJobLog.setStatus(ScheduleConstants.SUCCESS);
    } catch (Exception e) {
        sysJobLog.setStatus(ScheduleConstants.FAIL);
        sysJobLog.setExceptionInfo(ExceptionUtils.getStackTrace(e));
    } finally {
        sysJobLog.setStopTime(new Date());
        SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog);
    }
}

总结

通过上述设计,开源字节/source-vue的定时任务模块实现了高效的任务执行和详细的日志记录功能。任务调度灵活可控,日志记录全面透明,为系统的稳定运行提供了有力保障。

任务异常处理

在开源字节/source-vue的定时任务模块中,任务异常处理是一个关键的设计环节。通过合理的异常捕获和处理机制,可以确保任务执行过程中的错误不会导致系统崩溃,同时能够记录详细的错误信息以便后续排查。以下将详细介绍该模块中的异常处理机制及其实现方式。

异常捕获与记录

定时任务在执行过程中可能会遇到多种异常情况,例如目标方法调用失败、Cron表达式解析错误等。为了确保系统的稳定性,AbstractQuartzJob类中实现了对异常的捕获和记录:

try {
    // 执行任务逻辑
} catch (Exception e) {
    log.error("任务执行异常 - :", e);
    String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000);
    sysJobLog.setExceptionInfo(errorMsg);
}
  • 异常捕获:通过try-catch块捕获任务执行过程中抛出的所有异常。
  • 错误日志记录:使用日志工具记录异常堆栈信息,便于开发人员快速定位问题。
  • 异常信息截断:由于数据库字段长度限制,异常信息会被截断为2000字符以内。

异常信息存储

任务执行过程中产生的异常信息会被存储到SysJobLog表中,具体字段为exceptionInfo。以下是相关代码片段:

public class SysJobLog {
    private String exceptionInfo;

    public String getExceptionInfo() {
        return exceptionInfo;
    }

    public void setExceptionInfo(String exceptionInfo) {
        this.exceptionInfo = exceptionInfo;
    }
}

异常处理流程

  1. 任务执行:任务通过JobInvokeUtil.invokeMethod调用目标方法。
  2. 异常捕获:如果目标方法抛出异常,AbstractQuartzJob会捕获并记录异常信息。
  3. 日志存储:异常信息被写入SysJobLog表,供后续查询和分析。

异常分类与处理

定时任务模块中常见的异常类型包括:

异常类型描述处理方式
TaskException任务配置错误(如Cron表达式无效)返回错误提示,阻止任务执行
ParseExceptionCron表达式解析失败记录日志并提示用户修正表达式
目标方法调用异常目标方法执行过程中抛出异常捕获异常并记录到日志,任务状态标记为失败

示例代码

以下是一个典型的任务异常处理流程示例:

public class RyTask {
    public void ryParams(String params) {
        try {
            // 业务逻辑
        } catch (Exception e) {
            throw new RuntimeException("任务执行失败:" + e.getMessage(), e);
        }
    }
}

流程图

通过流程图展示任务异常处理的流程:

mermaid

通过以上机制,开源字节/source-vue的定时任务模块实现了对任务执行过程中异常的全面捕获和处理,确保了系统的稳定性和可维护性。

总结

开源字节/source-vue的定时任务模块通过SysJob和SysJobLog的设计,结合Quartz框架的集成,实现了灵活、高效的任务调度功能。任务执行与日志记录功能确保了系统的透明性和可追溯性,而完善的异常处理机制则保障了系统的稳定性。该模块的设计充分体现了高可用性和灵活性,为开发者提供了强大的定时任务管理能力。

【免费下载链接】source-vue 🔥 一直想做一款追求极致用户体验的快速开发平台,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间对若依框架进行扩展写了一套快速开发系统。如此有了开源字节快速开发平台。该平台基于 Spring Boot + MyBatis + Vue & Element ,包含微信小程序 & Uniapp, Web 报表、可视化大屏、三方登录、支付、短信、邮件、OSS... 【免费下载链接】source-vue 项目地址: https://gitcode.com/open-source-byte/source-vue

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值