开源字节/source-vue的定时任务模块
文章详细介绍了开源字节/source-vue项目中定时任务模块的设计与实现,重点分析了SysJob和SysJobLog两个核心实体类的设计,以及Quartz框架的集成与任务调度功能。文章还深入探讨了任务执行与日志记录的实现细节,以及任务异常处理的机制。
SysJob与SysJobLog设计
在开源字节/source-vue的定时任务模块中,SysJob和SysJobLog是两个核心实体类,分别用于描述定时任务的配置信息和执行日志记录。以下是对这两个类的详细设计分析。
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: 任务的唯一标识。jobName和jobGroup: 用于区分任务和任务组。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: 日志的唯一标识。jobName和jobGroup: 关联到对应的任务。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. 类关系图
以下是SysJob和SysJobLog的关系图:
4. 功能流程
定时任务的执行流程如下:
- 任务调度:
SysJob配置的任务通过ScheduleUtils类被调度执行。 - 日志记录:任务执行过程中,
SysJobLog记录执行状态和结果。 - 异常处理:若任务执行失败,
exceptionInfo字段记录异常信息。
5. 总结
SysJob和SysJobLog的设计充分体现了定时任务模块的灵活性和可扩展性。通过SysJob配置任务,SysJobLog记录执行详情,开发者可以轻松管理和监控系统中的定时任务。
Quartz集成与任务调度
在开源字节的source-vue项目中,定时任务模块通过集成Quartz框架实现了灵活的任务调度功能。Quartz是一个功能强大且易于使用的开源任务调度库,支持复杂的调度需求,如定时执行、任务持久化以及集群环境下的任务协调。本节将详细介绍Quartz在项目中的集成方式、核心功能实现以及任务调度的最佳实践。
Quartz的核心组件
Quartz的核心组件包括Scheduler、Job、Trigger和JobDetail。在source-vue中,这些组件通过以下类实现:
-
Scheduler
由ScheduleConfig类配置,负责管理任务的启动、暂停和停止。@Bean public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setDataSource(dataSource); return factory; } -
Job
通过继承AbstractQuartzJob实现任务逻辑,例如QuartzDisallowConcurrentExecution和QuartzJobExecution。public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob { @Override public void execute(JobExecutionContext context) { // 任务逻辑 } } -
Trigger
使用CronTrigger定义任务的执行时间,通过ScheduleUtils类动态创建和管理触发器。public static void createScheduleJob(Scheduler scheduler, SysJob job) { // 创建触发器逻辑 } -
JobDetail
封装任务的具体信息,如任务名称、组别和调用目标。
任务调度的实现流程
-
任务定义与持久化
任务信息存储在SysJob表中,包括任务名称、调用目标、Cron表达式等字段。public class SysJob { private Long jobId; private String jobName; private String invokeTarget; private String cronExpression; // 其他字段 } -
任务调度与执行
通过ScheduleUtils类动态创建任务并注册到Scheduler中。
-
任务日志记录
任务执行结果记录在SysJobLog表中,便于监控和排查问题。public class SysJobLog { private Long jobLogId; private String jobName; private String status; private String exceptionInfo; // 其他字段 }
任务调度的最佳实践
-
避免并发执行
通过QuartzDisallowConcurrentExecution类确保同一任务不会并发执行。public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob { // 实现逻辑 } -
动态任务管理
支持通过接口动态添加、修改和删除任务,例如:@PostMapping public AjaxResult add(@RequestBody SysJob job) { // 添加任务逻辑 } -
任务监控与日志
提供任务执行日志查询和清理功能,便于运维管理。@DeleteMapping("/clean") public AjaxResult clean() { // 清理日志逻辑 }
通过以上设计和实现,source-vue的定时任务模块不仅满足了业务需求,还提供了高可用性和灵活性。
任务执行与日志记录
在开源字节/source-vue的定时任务模块中,任务执行与日志记录是核心功能之一。通过任务执行,系统能够按照预定的时间规则自动触发任务,而日志记录则确保了任务执行过程的透明性和可追溯性。以下将详细介绍这两个功能的实现细节。
任务执行
任务执行的核心逻辑由ScheduleUtils和JobInvokeUtil两个工具类实现。ScheduleUtils负责与Quartz调度器交互,管理任务的创建、暂停、恢复和删除;JobInvokeUtil则负责动态调用任务目标方法。
任务调度流程
关键代码示例
-
任务触发
@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); } -
动态方法调用
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共同完成。日志记录了任务的执行状态、执行时间、异常信息等关键数据。
日志记录流程
关键代码示例
-
日志实体类
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; } -
日志服务实现
@Override public void addJobLog(SysJobLog jobLog) { jobLogMapper.insertJobLog(jobLog); } -
日志清理
@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;
}
}
异常处理流程
- 任务执行:任务通过
JobInvokeUtil.invokeMethod调用目标方法。 - 异常捕获:如果目标方法抛出异常,
AbstractQuartzJob会捕获并记录异常信息。 - 日志存储:异常信息被写入
SysJobLog表,供后续查询和分析。
异常分类与处理
定时任务模块中常见的异常类型包括:
| 异常类型 | 描述 | 处理方式 |
|---|---|---|
TaskException | 任务配置错误(如Cron表达式无效) | 返回错误提示,阻止任务执行 |
ParseException | Cron表达式解析失败 | 记录日志并提示用户修正表达式 |
| 目标方法调用异常 | 目标方法执行过程中抛出异常 | 捕获异常并记录到日志,任务状态标记为失败 |
示例代码
以下是一个典型的任务异常处理流程示例:
public class RyTask {
public void ryParams(String params) {
try {
// 业务逻辑
} catch (Exception e) {
throw new RuntimeException("任务执行失败:" + e.getMessage(), e);
}
}
}
流程图
通过流程图展示任务异常处理的流程:
通过以上机制,开源字节/source-vue的定时任务模块实现了对任务执行过程中异常的全面捕获和处理,确保了系统的稳定性和可维护性。
总结
开源字节/source-vue的定时任务模块通过SysJob和SysJobLog的设计,结合Quartz框架的集成,实现了灵活、高效的任务调度功能。任务执行与日志记录功能确保了系统的透明性和可追溯性,而完善的异常处理机制则保障了系统的稳定性。该模块的设计充分体现了高可用性和灵活性,为开发者提供了强大的定时任务管理能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



