refactor(quartz): 重构定时任务相关服务和控制器

This commit is contained in:
2026-01-15 16:17:23 +08:00
parent 40f4657d6f
commit bb664df62f
55 changed files with 468 additions and 404 deletions
@@ -24,6 +24,7 @@ import cn.odboy.system.dal.model.request.SystemUpdateQuartzJobArgs;
import cn.odboy.system.dal.model.response.SystemQuartzJobVo;
import cn.odboy.system.framework.operalog.OperationLog;
import cn.odboy.system.service.SystemQuartzJobService;
import cn.odboy.util.KitBeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -86,7 +87,7 @@ public class SystemQuartzJobController {
@ApiOperation("新增定时任务")
@PostMapping(value = "/createQuartzJob")
@PreAuthorize("@el.check('quartzJob:add')")
public ResponseEntity<Void> createQuartzJob(@Validated @RequestBody SystemQuartzJobVo args) {
public ResponseEntity<Void> createQuartzJob(@Validated @RequestBody SystemQuartzJobTb args) {
systemQuartzJobService.createJob(args);
return ResponseEntity.ok(null);
}
@@ -106,7 +107,9 @@ public class SystemQuartzJobController {
@PostMapping(value = "/switchQuartzJobStatus/{id}")
@PreAuthorize("@el.check('quartzJob:edit')")
public ResponseEntity<Void> switchQuartzJobStatus(@PathVariable Long id) {
systemQuartzJobService.switchQuartzJobStatus(systemQuartzJobService.getQuartzJobById(id));
SystemQuartzJobTb quartzJobTb = systemQuartzJobService.getQuartzJobById(id);
SystemQuartzJobVo quartzJobVo = KitBeanUtil.copyToClass(quartzJobTb, SystemQuartzJobVo.class);
systemQuartzJobService.switchQuartzJobStatus(quartzJobVo);
return ResponseEntity.ok(null);
}
@@ -115,7 +118,9 @@ public class SystemQuartzJobController {
@PostMapping(value = "/startQuartzJob/{id}")
@PreAuthorize("@el.check('quartzJob:edit')")
public ResponseEntity<Void> startQuartzJob(@PathVariable Long id) {
systemQuartzJobService.startQuartzJob(systemQuartzJobService.getQuartzJobById(id));
SystemQuartzJobTb quartzJobTb = systemQuartzJobService.getQuartzJobById(id);
SystemQuartzJobVo quartzJobVo = KitBeanUtil.copyToClass(quartzJobTb, SystemQuartzJobVo.class);
systemQuartzJobService.startQuartzJob(quartzJobVo);
return ResponseEntity.ok(null);
}
@@ -16,8 +16,6 @@
package cn.odboy.system.dal.mysql;
import cn.odboy.system.dal.dataobject.SystemQuartzJobTb;
import cn.odboy.system.dal.model.response.SystemQuartzJobVo;
import cn.odboy.util.KitBeanUtil;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@@ -29,7 +27,4 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SystemQuartzJobMapper extends BaseMapper<SystemQuartzJobTb> {
default SystemQuartzJobVo selectVoById(String id) {
return KitBeanUtil.copyToClass(selectById(id), SystemQuartzJobVo.class);
}
}
@@ -15,8 +15,10 @@
*/
package cn.odboy.system.framework.quartz;
import cn.odboy.system.dal.dataobject.SystemQuartzJobTb;
import cn.odboy.system.dal.model.response.SystemQuartzJobVo;
import cn.odboy.system.service.SystemQuartzJobService;
import cn.odboy.util.KitBeanUtil;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -40,8 +42,9 @@ public class ActiveJobRegister implements ApplicationRunner {
*/
@Override
public void run(ApplicationArguments applicationArguments) {
List<SystemQuartzJobVo> quartzJobs = systemQuartzJobService.listEnableQuartzJob();
quartzJobs.forEach(quartzManage::addJob);
List<SystemQuartzJobTb> quartzJobTbs = systemQuartzJobService.listEnableQuartzJob();
List<SystemQuartzJobVo> quartzJobVos = KitBeanUtil.copyToList(quartzJobTbs, SystemQuartzJobVo.class);
quartzJobVos.forEach(quartzManage::addJob);
log.info("Timing task injection complete");
}
}
@@ -18,6 +18,7 @@ package cn.odboy.system.framework.quartz;
import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.system.dal.dataobject.SystemQuartzJobTb;
import cn.odboy.system.dal.model.response.SystemQuartzJobVo;
import cn.odboy.util.KitBeanUtil;
import java.util.Date;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@@ -45,12 +46,17 @@ public class QuartzManage {
public void addJob(SystemQuartzJobVo quartzJob) {
try {
String uuid = JOB_NAME + quartzJob.getId();
// 构建job信息
JobDetail jobDetail =
JobBuilder.newJob(ExecutionJobBean.class).withIdentity(JOB_NAME + quartzJob.getId()).build();
JobDetail jobDetail = JobBuilder.newJob(ExecutionJobBean.class)
.withIdentity(uuid)
.build();
// 通过触发器名和cron 表达式创建 Trigger
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(JOB_NAME + quartzJob.getId()).startNow()
.withSchedule(CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression())).build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(uuid)
.startNow()
.withSchedule(CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression()))
.build();
trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob);
// 重置启动时间
((CronTriggerImpl) trigger).setStartTime(new Date());
@@ -75,24 +81,25 @@ public class QuartzManage {
*
* @param quartzJob /
*/
public void updateJobCron(SystemQuartzJobVo quartzJob) {
public void updateJobCron(SystemQuartzJobTb quartzJob) {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());
SystemQuartzJobVo quartzJobVo = KitBeanUtil.copyToClass(quartzJob, SystemQuartzJobVo.class);
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJobVo.getId());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务
if (trigger == null) {
addJob(quartzJob);
addJob(quartzJobVo);
trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
}
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression());
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJobVo.getCronExpression());
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
// 重置启动时间
((CronTriggerImpl) trigger).setStartTime(new Date());
trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob);
trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJobVo);
scheduler.rescheduleJob(triggerKey, trigger);
// 暂停任务
if (quartzJob.getIsPause()) {
pauseJob(quartzJob);
if (quartzJobVo.getIsPause()) {
pauseJob(quartzJobVo);
}
} catch (Exception e) {
log.error("更新定时任务失败", e);
@@ -144,7 +151,8 @@ public class QuartzManage {
*/
public void runJobNow(SystemQuartzJobVo quartzJob) {
try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());
String uuid = JOB_NAME + quartzJob.getId();
TriggerKey triggerKey = TriggerKey.triggerKey(uuid);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务
if (trigger == null) {
@@ -152,7 +160,7 @@ public class QuartzManage {
}
JobDataMap dataMap = new JobDataMap();
dataMap.put(SystemQuartzJobTb.JOB_KEY, quartzJob);
JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId());
JobKey jobKey = JobKey.jobKey(uuid);
scheduler.triggerJob(jobKey, dataMap);
} catch (Exception e) {
log.error("定时任务执行失败", e);
@@ -156,6 +156,9 @@ public class SystemLocalStorageService {
wrapper.orderByDesc(SystemLocalStorageTb::getId);
}
/**
* 查询文件上传记录 -> TestPassed
*/
public List<SystemLocalStorageTb> queryLocalStorageByArgs(SystemQueryStorageArgs args) {
LambdaQueryWrapper<SystemLocalStorageTb> wrapper = new LambdaQueryWrapper<>();
this.injectQueryParams(args, wrapper);
@@ -163,7 +166,7 @@ public class SystemLocalStorageService {
}
/**
* 上传图片
* 上传图片 -> TestPassed
*/
@Transactional(rollbackFor = Exception.class)
public SystemLocalStorageTb uploadPicture(MultipartFile file) {
@@ -176,12 +179,11 @@ public class SystemLocalStorageService {
}
/**
* 导出文件上传记录
* 导出文件上传记录 -> TestPassed
*/
public void exportLocalStorageXlsx(HttpServletResponse response, SystemQueryStorageArgs args) {
List<SystemLocalStorageTb> systemLocalStorageTbs = this.queryLocalStorageByArgs(args);
List<SystemLocalStorageExportRowVo> rowVos =
KitBeanUtil.copyToList(systemLocalStorageTbs, SystemLocalStorageExportRowVo.class);
List<SystemLocalStorageExportRowVo> rowVos = KitBeanUtil.copyToList(systemLocalStorageTbs, SystemLocalStorageExportRowVo.class);
KitExcelExporter.exportSimple(response, "文件上传记录数据", SystemLocalStorageExportRowVo.class, rowVos);
}
}
@@ -75,7 +75,7 @@ public class SystemMonitorService {
}
/**
* 查询磁盘信息
* 查询磁盘信息 -> TestPassed
*
* @return /
*/
@@ -109,7 +109,7 @@ public class SystemMonitorService {
}
/**
* 查询交换区信息
* 查询交换区信息 -> TestPassed
*
* @param memory /
* @return /
@@ -131,7 +131,7 @@ public class SystemMonitorService {
}
/**
* 查询内存信息
* 查询内存信息 -> TestPassed
*
* @param memory /
* @return /
@@ -147,7 +147,7 @@ public class SystemMonitorService {
}
/**
* 查询Cpu相关信息
* 查询Cpu相关信息 -> TestPassed
*
* @param processor /
* @return /
@@ -194,7 +194,7 @@ public class SystemMonitorService {
}
/**
* 查询系统相关信息,系统、运行天数、系统IP
* 查询系统相关信息,系统、运行天数、系统IP -> TestPassed
*
* @param os /
* @return /
@@ -18,7 +18,7 @@ public class SystemOperationLogService {
private SystemOperationLogMapper systemOperationLogMapper;
/**
* 查询用户操作日志
* 查询用户操作日志 -> TestPassed
*/
public IPage<SystemOperationLogTb> searchUserLog(KitPageArgs<SystemQueryOperationLogArgs> pageArgs) {
LambdaQueryWrapper<SystemOperationLogTb> wrapper = new LambdaQueryWrapper<>();
@@ -34,7 +34,6 @@ import cn.odboy.system.dal.mysql.SystemQuartzLogMapper;
import cn.odboy.system.framework.quartz.QuartzManage;
import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -79,7 +78,7 @@ public class SystemQuartzJobService {
* @param args /
*/
@Transactional(rollbackFor = Exception.class)
public void createJob(SystemQuartzJobVo args) {
public void createJob(SystemQuartzJobTb args) {
if (args.getId() != null) {
throw new BadRequestException("无效参数id");
}
@@ -88,9 +87,9 @@ public class SystemQuartzJobService {
if (!CronExpression.isValidExpression(args.getCronExpression())) {
throw new BadRequestException("cron表达式格式错误");
}
SystemQuartzJobTb record = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class);
systemQuartzJobMapper.insert(record);
quartzManage.addJob(args);
systemQuartzJobMapper.insert(args);
SystemQuartzJobVo quartzJobVo = KitBeanUtil.copyToClass(args, SystemQuartzJobVo.class);
quartzManage.addJob(quartzJobVo);
}
/**
@@ -112,28 +111,27 @@ public class SystemQuartzJobService {
}
}
SystemQuartzJobTb jobTb = KitBeanUtil.copyToClass(args, SystemQuartzJobTb.class);
systemQuartzJobMapper.insertOrUpdate(jobTb);
SystemQuartzJobVo jobVo = KitBeanUtil.copyToClass(args, SystemQuartzJobVo.class);
quartzManage.updateJobCron(jobVo);
systemQuartzJobMapper.updateById(jobTb);
quartzManage.updateJobCron(jobTb);
}
/**
* 更改定时任务状态
*
* @param quartzJob /
* @param quartzJobVo /
*/
@Transactional(rollbackFor = Exception.class)
public void switchQuartzJobStatus(SystemQuartzJobVo quartzJob) {
public void switchQuartzJobStatus(SystemQuartzJobVo quartzJobVo) {
// 置换暂停状态
if (quartzJob.getIsPause()) {
quartzManage.resumeJob(quartzJob);
quartzJob.setIsPause(false);
if (quartzJobVo.getIsPause()) {
quartzManage.resumeJob(quartzJobVo);
quartzJobVo.setIsPause(false);
} else {
quartzManage.pauseJob(quartzJob);
quartzJob.setIsPause(true);
quartzManage.pauseJob(quartzJobVo);
quartzJobVo.setIsPause(true);
}
SystemQuartzJobTb quartzJobTb = KitBeanUtil.copyToClass(quartzJob, SystemQuartzJobTb.class);
systemQuartzJobMapper.insertOrUpdate(quartzJobTb);
SystemQuartzJobTb record = KitBeanUtil.copyToClass(quartzJobVo, SystemQuartzJobTb.class);
systemQuartzJobMapper.updateById(record);
}
/**
@@ -172,16 +170,16 @@ public class SystemQuartzJobService {
// 如果是手动清除子任务id, 会出现id为空字符串的问题
continue;
}
SystemQuartzJobVo quartzJob = systemQuartzJobMapper.selectVoById(id);
if (quartzJob == null) {
SystemQuartzJobTb quartzJobTb = systemQuartzJobMapper.selectById(id);
if (quartzJobTb == null) {
// 防止子任务不存在
continue;
}
SystemQuartzJobVo quartzJobVo = KitBeanUtil.copyToClass(quartzJobTb, SystemQuartzJobVo.class);
// 执行任务
String uuid = IdUtil.simpleUUID();
quartzJob.setUuid(uuid);
// 执行任务
startQuartzJob(quartzJob);
quartzJobVo.setUuid(uuid);
startQuartzJob(quartzJobVo);
// 查询执行状态, 如果执行失败则停止后面的子任务执行
Boolean result = redisHelper.get(uuid, Boolean.class);
while (result == null) {
@@ -203,25 +201,23 @@ public class SystemQuartzJobService {
* @param page 分页参数
* @return /
*/
public KitPageResult<SystemQuartzJobTb> searchQuartzJobByArgs(SystemQueryQuartzJobArgs args,
Page<SystemQuartzJobTb> page) {
public KitPageResult<SystemQuartzJobTb> searchQuartzJobByArgs(SystemQueryQuartzJobArgs args, Page<SystemQuartzJobTb> page) {
LambdaQueryWrapper<SystemQuartzJobTb> wrapper = new LambdaQueryWrapper<>();
this.injectQuartzJobQueryParams(args, wrapper);
return KitPageUtil.toPage(systemQuartzJobMapper.selectPage(page, wrapper));
}
private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs args,
LambdaQueryWrapper<SystemQuartzJobTb> wrapper) {
KitValidUtil.notNull(args);
wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzJobTb::getJobName, args.getJobName());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemQuartzJobTb::getUpdateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
private void injectQuartzJobQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper<SystemQuartzJobTb> wrapper) {
if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzJobTb::getJobName, args.getJobName());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemQuartzJobTb::getUpdateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
}
}
wrapper.orderByDesc(SystemQuartzJobTb::getId);
}
private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args,
LambdaQueryWrapper<SystemQuartzLogTb> wrapper) {
private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper<SystemQuartzLogTb> wrapper) {
if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName());
wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess());
@@ -271,16 +267,15 @@ public class SystemQuartzJobService {
return systemQuartzLogMapper.selectList(wrapper);
}
public SystemQuartzJobVo getQuartzJobById(Long id) {
return KitBeanUtil.copyToClass(systemQuartzJobMapper.selectById(id), SystemQuartzJobVo.class);
}
public List<SystemQuartzJobVo> listEnableQuartzJob() {
public List<SystemQuartzJobTb> listEnableQuartzJob() {
LambdaQueryWrapper<SystemQuartzJobTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemQuartzJobTb::getIsPause, 0);
return KitBeanUtil.copyToList(systemQuartzJobMapper.selectList(wrapper), SystemQuartzJobVo.class);
return systemQuartzJobMapper.selectList(wrapper);
}
/**
* 导出定时任务数据 -> TestPassed
*/
public void exportQuartzJobXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) {
List<SystemQuartzJobTb> systemQuartzJobTbs = this.queryQuartzJobByArgs(args);
List<SystemQuartzJobExportRowVo> rowVos = new ArrayList<>();
@@ -299,6 +294,9 @@ public class SystemQuartzJobService {
KitExcelExporter.exportSimple(response, "定时任务数据", SystemQuartzJobExportRowVo.class, rowVos);
}
/**
* 导出定时任务日志数据 -> TestPassed
*/
public void exportQuartzLogXlsx(HttpServletResponse response, SystemQueryQuartzJobArgs args) {
List<SystemQuartzLogTb> systemQuartzLogTbs = this.queryQuartzLogByArgs(args);
List<SystemQuartzLogExportRowVo> rowVos = new ArrayList<>();
@@ -317,4 +315,8 @@ public class SystemQuartzJobService {
}
KitExcelExporter.exportSimple(response, "定时任务日志数据", SystemQuartzLogExportRowVo.class, rowVos);
}
public SystemQuartzJobTb getQuartzJobById(Long id) {
return systemQuartzJobMapper.selectById(id);
}
}