ruoyi-vue-pro定时任务:Quartz调度器与分布式任务

ruoyi-vue-pro定时任务:Quartz调度器与分布式任务

【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM、ERP、AI 大模型等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】ruoyi-vue-pro 项目地址: https://gitcode.com/GitHub_Trending/ruoy/ruoyi-vue-pro

在企业级应用开发中,定时任务是不可或缺的核心功能。ruoyi-vue-pro基于Quartz调度器框架,提供了强大而灵活的定时任务解决方案,支持分布式部署和高可用性。本文将深入解析其架构设计、核心实现和使用方法。

定时任务架构概览

ruoyi-vue-pro的定时任务模块采用分层架构设计,核心组件包括:

mermaid

Quartz分布式原理

ruoyi-vue-pro采用Quartz的JDBCJobStore实现分布式调度,通过数据库表实现任务状态的持久化和集群协调。

核心数据库表结构

表名功能描述关键字段
QRTZ_JOB_DETAILS存储Job详细信息JOB_NAME, JOB_GROUP, JOB_CLASS_NAME
QRTZ_TRIGGERS存储触发器信息TRIGGER_NAME, TRIGGER_GROUP, CRON_EXPRESSION
QRTZ_FIRED_TRIGGERS记录正在执行的触发器INSTANCE_NAME, FIRED_TIME, STATE
QRTZ_SCHEDULER_STATE调度器状态信息INSTANCE_NAME, LAST_CHECKIN_TIME

集群协调机制

mermaid

核心代码实现解析

JobHandler接口定义

所有定时任务都需要实现JobHandler接口:

public interface JobHandler {

    /**
     * 执行任务
     *
     * @param param 参数
     * @return 执行结果
     */
    String execute(String param);

}

任务执行器实现

JobHandlerInvoker作为Quartz Job的通用执行器:

public class JobHandlerInvoker extends QuartzJobBean {
    
    @Override
    protected void executeInternal(JobExecutionContext context) {
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        Long jobId = (Long) jobDataMap.get(JobDataKeyEnum.JOB_ID.name());
        String jobHandlerName = (String) jobDataMap.get(JobDataKeyEnum.JOB_HANDLER_NAME.name());
        
        // 从Spring容器获取JobHandler实例
        JobHandler jobHandler = applicationContext.getBean(jobHandlerName, JobHandler.class);
        
        // 执行任务并记录日志
        String result = jobHandler.execute(jobHandlerParam);
        jobLogFrameworkService.updateJobLogSuccess(jobLogId, result);
    }
}

调度器管理核心

SchedulerManager提供完整的任务管理API:

public class SchedulerManager {
    
    public void addJob(Long jobId, String jobHandlerName, String jobHandlerParam, 
                      String cronExpression, Integer retryCount, Integer retryInterval) {
        // 创建JobDetail
        JobDetail jobDetail = JobBuilder.newJob(JobHandlerInvoker.class)
                .withIdentity(jobHandlerName)
                .usingJobData(JobDataKeyEnum.JOB_ID.name(), jobId)
                .usingJobData(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName)
                .build();
        
        // 创建Trigger
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(jobHandlerName)
                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
                .build();
        
        // 注册到调度器
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

实战:创建自定义定时任务

1. 实现JobHandler接口

@Component
public class DataSyncJob implements JobHandler {

    @Resource
    private UserService userService;
    
    @Override
    @TenantJob // 支持多租户
    public String execute(String param) {
        try {
            // 解析参数
            DataSyncParam syncParam = JSON.parseObject(param, DataSyncParam.class);
            
            // 执行数据同步逻辑
            int syncCount = userService.syncUserData(syncParam);
            
            return "成功同步" + syncCount + "条用户数据";
        } catch (Exception e) {
            throw new RuntimeException("数据同步失败", e);
        }
    }
    
    @Data
    public static class DataSyncParam {
        private Date startTime;
        private Date endTime;
        private String dataSource;
    }
}

2. 配置Cron表达式

ruoyi-vue-pro支持标准的Quartz Cron表达式:

表达式含义示例
0 0 0 * * ?每天凌晨执行日志清理任务
0 * * * * ?每分钟执行订单状态检查
0 0/5 * * * ?每5分钟执行数据同步任务
0 0 9 * * ?每天9点执行日报生成任务

3. 分布式部署配置

application.yml中配置Quartz集群:

spring:
  quartz:
    job-store-type: jdbc
    properties:
      org:
        quartz:
          scheduler:
            instanceName: clusteredScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_
            isClustered: true
            clusterCheckinInterval: 15000
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5

高级特性与最佳实践

1. 多租户支持

通过@TenantJob注解实现租户隔离:

@Override
@TenantJob
public String execute(String param) {
    // 自动处理租户上下文
    Long tenantId = TenantContextHolder.getTenantId();
    return "执行租户[" + tenantId + "]的任务";
}

2. 任务监控与告警

集成执行日志记录和异常告警:

public class JobHandlerInvoker extends QuartzJobBean {
    
    private void updateJobLogSuccess(Long jobLogId, String result) {
        jobLogFrameworkService.updateJobLogSuccess(jobLogId, result);
        
        // 发送成功通知
        if (StringUtils.isNotBlank(result)) {
            notifyService.sendJobSuccessNotification(jobLogId, result);
        }
    }
    
    private void updateJobLogFailure(Long jobLogId, Exception exception) {
        jobLogFrameworkService.updateJobLogFailure(jobLogId, exception);
        
        // 发送失败告警
        notifyService.sendJobFailureAlert(jobLogId, exception);
    }
}

3. 性能优化建议

场景优化策略效果
高频任务使用@DisallowConcurrentExecution避免重复执行
大数据量分页处理+批量操作减少内存占用
网络IO异步执行+超时控制提高响应速度
集群环境合理设置clusterCheckinInterval平衡性能与一致性

常见问题解决方案

1. 任务重复执行问题

症状:在集群环境中同一任务被多个实例同时执行

解决方案

-- 检查QRTZ_LOCKS表锁状态
SELECT * FROM QRTZ_LOCKS WHERE LOCK_NAME = 'TRIGGER_ACCESS';

-- 检查调度器实例状态
SELECT * FROM QRTZ_SCHEDULER_STATE;

2. Cron表达式不生效

排查步骤

  1. 验证Cron表达式格式是否正确
  2. 检查QRTZ_CRON_TRIGGERS表中配置
  3. 查看调度器日志中的解析错误

3. 内存泄漏排查

监控指标

  • QRTZ_FIRED_TRIGGERS表中长时间运行的任务
  • 线程池使用情况
  • 数据库连接池状态

总结

ruoyi-vue-pro的定时任务模块基于Quartz框架,提供了完整的企业级解决方案:

  1. 分布式支持:通过数据库持久化实现集群协调
  2. 灵活扩展:基于接口设计,易于添加新任务类型
  3. 监控完善:完整的执行日志和异常处理机制
  4. 多租户友好:支持SaaS场景下的租户隔离

通过本文的深入解析,您应该能够熟练掌握ruoyi-vue-pro定时任务的使用和定制开发,为构建可靠的企业级应用奠定坚实基础。

提示:在实际生产环境中,建议结合APM工具(如SkyWalking)进行全链路监控,确保定时任务的稳定运行。

【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 微信小程序,支持 RBAC 动态权限、数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付、短信、商城、CRM、ERP、AI 大模型等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】ruoyi-vue-pro 项目地址: https://gitcode.com/GitHub_Trending/ruoy/ruoyi-vue-pro

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

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

抵扣说明:

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

余额充值