Skip to content

Commit 0f9a9b1

Browse files
committed
[代码完善](v2.5): v2.5 beta 定时任务子任务优化完成
1、定时任务中子任务按顺序执行 2、如果子任务执行途中报错,则不会再执行后面的子任务 3、子任务按逗号隔开,中英文逗号都可以 4、子任务中不能添加自身的ID,不然会无限循环 2.5 进度: https://www.ydyno.com/archives/1225.html
1 parent 21f8b4e commit 0f9a9b1

5 files changed

Lines changed: 59 additions & 17 deletions

File tree

eladmin-system/src/main/java/me/zhengjie/modules/quartz/domain/QuartzJob.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ public class QuartzJob extends BaseEntity implements Serializable {
4242
@GeneratedValue(strategy = GenerationType.IDENTITY)
4343
private Long id;
4444

45+
@Transient
46+
@ApiModelProperty(value = "用于子任务唯一标识", hidden = true)
47+
private String uuid;
48+
4549
@ApiModelProperty(value = "定时器名称")
4650
private String jobName;
4751

eladmin-system/src/main/java/me/zhengjie/modules/quartz/service/QuartzJobService.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import me.zhengjie.modules.quartz.domain.QuartzLog;
2020
import me.zhengjie.modules.quartz.service.dto.JobQueryCriteria;
2121
import org.springframework.data.domain.Pageable;
22-
2322
import javax.servlet.http.HttpServletResponse;
2423
import java.io.IOException;
2524
import java.util.List;
@@ -113,4 +112,11 @@ public interface QuartzJobService {
113112
* @throws IOException /
114113
*/
115114
void downloadLog(List<QuartzLog> queryAllLog, HttpServletResponse response) throws IOException;
115+
116+
/**
117+
* 执行子任务
118+
* @param tasks /
119+
* @throws InterruptedException /
120+
*/
121+
void executionSubJob(String[] tasks) throws InterruptedException;
116122
}

eladmin-system/src/main/java/me/zhengjie/modules/quartz/service/impl/QuartzJobServiceImpl.java

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package me.zhengjie.modules.quartz.service.impl;
1717

18+
import cn.hutool.core.util.IdUtil;
1819
import lombok.RequiredArgsConstructor;
1920
import me.zhengjie.exception.BadRequestException;
2021
import me.zhengjie.modules.quartz.domain.QuartzJob;
@@ -24,12 +25,10 @@
2425
import me.zhengjie.modules.quartz.service.QuartzJobService;
2526
import me.zhengjie.modules.quartz.service.dto.JobQueryCriteria;
2627
import me.zhengjie.modules.quartz.utils.QuartzManage;
27-
import me.zhengjie.utils.FileUtil;
28-
import me.zhengjie.utils.PageUtil;
29-
import me.zhengjie.utils.QueryHelp;
30-
import me.zhengjie.utils.ValidationUtil;
28+
import me.zhengjie.utils.*;
3129
import org.quartz.CronExpression;
3230
import org.springframework.data.domain.Pageable;
31+
import org.springframework.scheduling.annotation.Async;
3332
import org.springframework.stereotype.Service;
3433
import org.springframework.transaction.annotation.Transactional;
3534
import javax.servlet.http.HttpServletResponse;
@@ -47,6 +46,7 @@ public class QuartzJobServiceImpl implements QuartzJobService {
4746
private final QuartzJobRepository quartzJobRepository;
4847
private final QuartzLogRepository quartzLogRepository;
4948
private final QuartzManage quartzManage;
49+
private final RedisUtils redisUtils;
5050

5151
@Override
5252
public Object queryAll(JobQueryCriteria criteria, Pageable pageable){
@@ -91,6 +91,12 @@ public void update(QuartzJob resources) {
9191
if (!CronExpression.isValidExpression(resources.getCronExpression())){
9292
throw new BadRequestException("cron表达式格式错误");
9393
}
94+
if(StringUtils.isNotBlank(resources.getSubTask())){
95+
List<String> tasks = Arrays.asList(resources.getSubTask().split("[,,]"));
96+
if (tasks.contains(resources.getId().toString())) {
97+
throw new BadRequestException("子任务中不能添加当前任务ID");
98+
}
99+
}
94100
resources = quartzJobRepository.save(resources);
95101
quartzManage.updateJobCron(resources);
96102
}
@@ -122,6 +128,31 @@ public void delete(Set<Long> ids) {
122128
}
123129
}
124130

131+
@Async
132+
@Override
133+
@Transactional(rollbackFor = Exception.class)
134+
public void executionSubJob(String[] tasks) throws InterruptedException {
135+
for (String id : tasks) {
136+
QuartzJob quartzJob = findById(Long.parseLong(id));
137+
// 执行任务
138+
String uuid = IdUtil.simpleUUID();
139+
quartzJob.setUuid(uuid);
140+
// 执行任务
141+
execution(quartzJob);
142+
// 获取执行状态,如果执行失败则停止后面的子任务执行
143+
Boolean result = (Boolean) redisUtils.get(uuid);
144+
while (result == null) {
145+
// 休眠5秒,再次获取子任务执行情况
146+
Thread.sleep(5000);
147+
result = (Boolean) redisUtils.get(uuid);
148+
}
149+
if(!result){
150+
redisUtils.del(uuid);
151+
break;
152+
}
153+
}
154+
}
155+
125156
@Override
126157
public void download(List<QuartzJob> quartzJobs, HttpServletResponse response) throws IOException {
127158
List<Map<String, Object>> list = new ArrayList<>();

eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/ExecutionJob.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,12 @@
2626
import me.zhengjie.modules.quartz.repository.QuartzLogRepository;
2727
import me.zhengjie.modules.quartz.service.QuartzJobService;
2828
import me.zhengjie.service.EmailService;
29+
import me.zhengjie.utils.RedisUtils;
2930
import me.zhengjie.utils.SpringContextHolder;
3031
import me.zhengjie.utils.ThrowableUtil;
3132
import org.quartz.JobExecutionContext;
32-
import org.slf4j.Logger;
33-
import org.slf4j.LoggerFactory;
3433
import org.springframework.scheduling.annotation.Async;
3534
import org.springframework.scheduling.quartz.QuartzJobBean;
36-
3735
import java.util.*;
3836
import java.util.concurrent.*;
3937

@@ -46,8 +44,6 @@
4644
@SuppressWarnings({"unchecked","all"})
4745
public class ExecutionJob extends QuartzJobBean {
4846

49-
private final Logger logger = LoggerFactory.getLogger(this.getClass());
50-
5147
/** 该处仅供参考 */
5248
private final static ThreadPoolExecutor EXECUTOR = ThreadPoolExecutorUtil.getPoll();
5349

@@ -57,6 +53,7 @@ public void executeInternal(JobExecutionContext context) {
5753
// 获取spring bean
5854
QuartzLogRepository quartzLogRepository = SpringContextHolder.getBean(QuartzLogRepository.class);
5955
QuartzJobService quartzJobService = SpringContextHolder.getBean(QuartzJobService.class);
56+
RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class);
6057

6158
QuartzLog log = new QuartzLog();
6259
log.setJobName(quartzJob.getJobName());
@@ -67,25 +64,29 @@ public void executeInternal(JobExecutionContext context) {
6764
log.setCronExpression(quartzJob.getCronExpression());
6865
try {
6966
// 执行任务
70-
logger.info("任务准备执行,任务名称:{}", quartzJob.getJobName());
67+
System.out.println("--------------------------------------------------------------");
68+
System.out.println("任务开始执行,任务名称:" + quartzJob.getJobName());
7169
QuartzRunnable task = new QuartzRunnable(quartzJob.getBeanName(), quartzJob.getMethodName(),
7270
quartzJob.getParams());
7371
Future<?> future = EXECUTOR.submit(task);
7472
future.get();
7573
long times = System.currentTimeMillis() - startTime;
7674
log.setTime(times);
75+
redisUtils.set(quartzJob.getUuid(), true);
7776
// 任务状态
7877
log.setIsSuccess(true);
79-
logger.info("任务执行完毕,任务名称:{} 总共耗时:{} 毫秒", quartzJob.getJobName(), times);
78+
System.out.println("任务执行完毕,任务名称:" + quartzJob.getJobName() + ", 执行时间:" + times + "毫秒");
79+
System.out.println("--------------------------------------------------------------");
8080
// 判断是否存在子任务
8181
if(quartzJob.getSubTask() != null){
8282
String[] tasks = quartzJob.getSubTask().split("[,,]");
83-
for (String id : tasks) {
84-
quartzJobService.execution(quartzJobService.findById(Long.parseLong(id)));
85-
}
83+
// 执行子任务
84+
quartzJobService.executionSubJob(tasks);
8685
}
8786
} catch (Exception e) {
88-
logger.error("任务执行失败,任务名称:{}" + quartzJob.getJobName(), e);
87+
redisUtils.set(quartzJob.getUuid(), false);
88+
System.out.println("任务执行失败,任务名称:" + quartzJob.getJobName());
89+
System.out.println("--------------------------------------------------------------");
8990
long times = System.currentTimeMillis() - startTime;
9091
log.setTime(times);
9192
// 任务状态 0:成功 1:失败

sql/eladmin.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ CREATE TABLE `sys_quartz_job` (
477477
-- Records of sys_quartz_job
478478
-- ----------------------------
479479
BEGIN;
480-
INSERT INTO `sys_quartz_job` VALUES (2, 'testTask', '0/5 * * * * ?', b'1', '测试1', 'run1', 'test', '带参测试,多参使用json', NULL, NULL, NULL, NULL, NULL, 'admin', '2019-08-22 14:08:29', '2020-05-05 17:26:19');
480+
INSERT INTO `sys_quartz_job` VALUES (2, 'testTask', '0/5 * * * * ?', b'1', '测试1', 'run1', 'test', '带参测试,多参使用json', '测试', NULL, NULL, NULL, NULL, 'admin', '2019-08-22 14:08:29', '2020-05-05 17:26:19');
481481
INSERT INTO `sys_quartz_job` VALUES (3, 'testTask', '0/5 * * * * ?', b'1', '测试', 'run', '', '不带参测试', 'Zheng Jie', '', '2,6', b'1', NULL, 'admin', '2019-09-26 16:44:39', '2020-05-05 20:45:39');
482482
INSERT INTO `sys_quartz_job` VALUES (5, 'Test', '0/5 * * * * ?', b'1', '任务告警测试', 'run', NULL, '测试', 'test', '', NULL, b'1', 'admin', 'admin', '2020-05-05 20:32:41', '2020-05-05 20:36:13');
483483
INSERT INTO `sys_quartz_job` VALUES (6, 'testTask', '0/5 * * * * ?', b'1', '测试3', 'run2', NULL, '测试3', 'Zheng Jie', '', NULL, b'1', 'admin', 'admin', '2020-05-05 20:35:41', '2020-05-05 20:36:07');

0 commit comments

Comments
 (0)