Merge pull request #3762 from dataease/pr@dev@feat_report_task_fire_now

feat(定时报告): 立即执行后台
This commit is contained in:
xuwei-fit2cloud 2022-11-16 09:55:56 +08:00 committed by GitHub
commit 32ab0b7f76
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 75 additions and 27 deletions

View File

@ -21,6 +21,7 @@ public class CronUtils {
/** /**
* 解析表达式获取CronTrigger * 解析表达式获取CronTrigger
*
* @param cron * @param cron
* @return * @return
*/ */
@ -33,6 +34,7 @@ public class CronUtils {
/** /**
* 获取以指定时间为开始时间的下一次执行时间 * 获取以指定时间为开始时间的下一次执行时间
*
* @param cron * @param cron
* @param start * @param start
* @return * @return
@ -40,7 +42,7 @@ public class CronUtils {
public static Date getNextTriggerTime(String cron, Date start) { public static Date getNextTriggerTime(String cron, Date start) {
if (start == null) { if (start == null) {
return getNextTriggerTime(cron); return getNextTriggerTime(cron);
}else{ } else {
CronTrigger trigger = getCronTrigger(cron); CronTrigger trigger = getCronTrigger(cron);
return trigger.getFireTimeAfter(start); return trigger.getFireTimeAfter(start);
} }
@ -48,19 +50,20 @@ public class CronUtils {
/** /**
* 获取以当前日期为准的下一次执行时间 * 获取以当前日期为准的下一次执行时间
*
* @param cron * @param cron
* @return * @return
*/ */
public static Date getNextTriggerTime(String cron) { public static Date getNextTriggerTime(String cron) {
Date date = null; Date date = null;
try{ try {
CronTrigger trigger = getCronTrigger(cron); CronTrigger trigger = getCronTrigger(cron);
Date startDate = trigger.getStartTime(); Date startDate = trigger.getStartTime();
date = trigger.getFireTimeAfter(startDate); date = trigger.getFireTimeAfter(startDate);
}catch (Exception e){ } catch (Exception e) {
} }
return date; return date;
} }
public static String cron(GlobalTaskEntity taskEntity) { public static String cron(GlobalTaskEntity taskEntity) {
@ -98,6 +101,15 @@ public class CronUtils {
return null; return null;
} }
public static String cron() {
Calendar instance = Calendar.getInstance();
instance.add(Calendar.SECOND, 5);
return instance.get(Calendar.SECOND) + " " +
instance.get(Calendar.MINUTE) + " " +
instance.get(Calendar.HOUR_OF_DAY) + " * * ?";
}
private static String getDayOfWeek(Calendar instance) { private static String getDayOfWeek(Calendar instance) {
int index = instance.get(Calendar.DAY_OF_WEEK); int index = instance.get(Calendar.DAY_OF_WEEK);
index = (index % 7) + 1; index = (index % 7) + 1;

View File

@ -12,6 +12,8 @@ import java.util.Date;
public abstract class TaskHandler implements InitializingBean { public abstract class TaskHandler implements InitializingBean {
protected static final String IS_TEMP_TASK = "isTempTask";
public void addTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception { public void addTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception {
// 1首先看看是否过期 // 1首先看看是否过期
Long endTime = taskEntity.getEndTime(); Long endTime = taskEntity.getEndTime();
@ -24,21 +26,31 @@ public abstract class TaskHandler implements InitializingBean {
Date start = new Date(taskEntity.getStartTime()); Date start = new Date(taskEntity.getStartTime());
Date end = null; Date end = null;
if (ObjectUtils.isNotEmpty(taskEntity.getEndTime())) { if (ObjectUtils.isNotEmpty(taskEntity.getEndTime())) {
new Date(taskEntity.getEndTime()); end = new Date(taskEntity.getEndTime());
} }
Class<? extends TaskHandler> executor = this.getClass(); Class<? extends TaskHandler> executor = this.getClass();
String cron = CronUtils.cron(taskEntity); String cron = CronUtils.cron(taskEntity);
scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, end, jobDataMap(taskEntity)); scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, end, jobDataMap(taskEntity));
} }
public void addTempTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception {
removeTask(scheduleManager, taskEntity);
JobKey jobKey = new JobKey(taskEntity.getTaskId().toString());
TriggerKey triggerKey = new TriggerKey(taskEntity.getTaskId().toString());
Date start = new Date(taskEntity.getStartTime());
Class<? extends TaskHandler> executor = this.getClass();
String cron = CronUtils.cron();
JobDataMap jobDataMap = jobDataMap(taskEntity);
jobDataMap.put(IS_TEMP_TASK, true);
scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, null, jobDataMap);
}
protected abstract JobDataMap jobDataMap(GlobalTaskEntity taskEntity); protected abstract JobDataMap jobDataMap(GlobalTaskEntity taskEntity);
public abstract void resetRunningInstance(Long taskId); public abstract void resetRunningInstance(Long taskId);
public void removeTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) { public void removeTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) {
JobKey jobKey = new JobKey(taskEntity.getTaskId().toString()); JobKey jobKey = new JobKey(taskEntity.getTaskId().toString());
TriggerKey triggerKey = new TriggerKey(taskEntity.getTaskId().toString()); TriggerKey triggerKey = new TriggerKey(taskEntity.getTaskId().toString());
@ -51,7 +63,6 @@ public abstract class TaskHandler implements InitializingBean {
} }
protected abstract Boolean taskIsRunning(Long taskId); protected abstract Boolean taskIsRunning(Long taskId);
@Override @Override

View File

@ -92,13 +92,14 @@ public class EmailTaskHandler extends TaskHandler implements Job {
return; return;
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
Boolean isTempTask = (Boolean) jobDataMap.getOrDefault(IS_TEMP_TASK, false);
GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity"); GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity");
ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class); ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class);
if (CronUtils.taskExpire(taskEntity.getEndTime())) { if (!isTempTask && CronUtils.taskExpire(taskEntity.getEndTime())) {
removeTask(scheduleManager, taskEntity); removeTask(scheduleManager, taskEntity);
return; return;
} }
if (taskIsRunning(taskEntity.getTaskId())) { if (!isTempTask && taskIsRunning(taskEntity.getTaskId())) {
LogUtil.info("Skip synchronization task: {} ,due to task status is {}", LogUtil.info("Skip synchronization task: {} ,due to task status is {}",
taskEntity.getTaskId(), "running"); taskEntity.getTaskId(), "running");
return; return;
@ -111,7 +112,10 @@ public class EmailTaskHandler extends TaskHandler implements Job {
XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate"); XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate");
SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator"); SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator");
LogUtil.info("start execute send panel report task..."); LogUtil.info("start execute send panel report task...");
proxy(taskEntity.getTaskType()).sendReport(taskInstance, emailTemplate, creator); proxy(taskEntity.getTaskType()).sendReport(taskInstance, emailTemplate, creator, isTempTask);
if (isTempTask) {
removeTask(scheduleManager, taskEntity);
}
} }
@ -156,7 +160,7 @@ public class EmailTaskHandler extends TaskHandler implements Job {
} }
@Async("priorityExecutor") @Async("priorityExecutor")
public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) { public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user, Boolean isTempTask) {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class); AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class);
@ -164,7 +168,7 @@ public class EmailTaskHandler extends TaskHandler implements Job {
List<File> files = null; List<File> files = null;
try { try {
XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId()); XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId());
if (ObjectUtils.isEmpty(taskForm) || CronUtils.taskExpire(taskForm.getEndTime())) { if (ObjectUtils.isEmpty(taskForm) || (!isTempTask && CronUtils.taskExpire(taskForm.getEndTime()))) {
removeInstance(taskInstance); removeInstance(taskInstance);
return; return;
} }

View File

@ -16,9 +16,8 @@ import javax.annotation.Resource;
public class EmailTaskViewHandler extends EmailTaskHandler { public class EmailTaskViewHandler extends EmailTaskHandler {
@Async("priorityExecutor") @Async("priorityExecutor")
public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) { public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user, Boolean isTempTask) {
super.sendReport(taskInstance, emailTemplateDTO, user); super.sendReport(taskInstance, emailTemplateDTO, user, isTempTask);
} }
} }

View File

@ -56,7 +56,7 @@ public class XEmailTaskServer {
@RequiresPermissions("task-email:read") @RequiresPermissions("task-email:read")
@PostMapping("/queryTasks/{goPage}/{pageSize}") @PostMapping("/queryTasks/{goPage}/{pageSize}")
public Pager<List<XpackTaskGridDTO>> queryTask(@PathVariable int goPage, @PathVariable int pageSize, public Pager<List<XpackTaskGridDTO>> queryTask(@PathVariable int goPage, @PathVariable int pageSize,
@RequestBody XpackGridRequest request) { @RequestBody XpackGridRequest request) {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
Page<Object> page = PageHelper.startPage(goPage, pageSize, true); Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
CurrentUserDto user = AuthUtils.getUser(); CurrentUserDto user = AuthUtils.getUser();
@ -76,17 +76,17 @@ public class XEmailTaskServer {
tasks.forEach(item -> { tasks.forEach(item -> {
if (CronUtils.taskExpire(item.getEndTime())) { if (CronUtils.taskExpire(item.getEndTime())) {
item.setNextExecTime(null); item.setNextExecTime(null);
}else { } else {
GlobalTaskEntity globalTaskEntity = new GlobalTaskEntity(); GlobalTaskEntity globalTaskEntity = new GlobalTaskEntity();
globalTaskEntity.setRateType(item.getRateType()); globalTaskEntity.setRateType(item.getRateType());
globalTaskEntity.setRateVal(item.getRateVal()); globalTaskEntity.setRateVal(item.getRateVal());
try{ try {
String cron = CronUtils.cron(globalTaskEntity); String cron = CronUtils.cron(globalTaskEntity);
if (StringUtils.isNotBlank(cron)) { if (StringUtils.isNotBlank(cron)) {
Long nextTime = CronUtils.getNextTriggerTime(cron).getTime(); Long nextTime = CronUtils.getNextTriggerTime(cron).getTime();
item.setNextExecTime(nextTime); item.setNextExecTime(nextTime);
} }
}catch (Exception e) { } catch (Exception e) {
item.setNextExecTime(null); item.setNextExecTime(null);
} }
} }
@ -98,6 +98,20 @@ public class XEmailTaskServer {
return listPager; return listPager;
} }
@RequiresPermissions("task-email:edit")
@PostMapping("/fireNow/{taskId}")
public void fireNow(@PathVariable("taskId") Long taskId) throws Exception {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
XpackEmailTaskRequest request = emailXpackService.taskForm(taskId);
GlobalTaskEntity globalTaskEntity = BeanUtils.copyBean(new GlobalTaskEntity(), request);
if (CronUtils.taskExpire(globalTaskEntity.getEndTime())) {
globalTaskEntity.setEndTime(null);
scheduleService.addTempSchedule(globalTaskEntity);
return;
}
scheduleService.fireNow(globalTaskEntity);
}
@RequiresPermissions("task-email:add") @RequiresPermissions("task-email:add")
@PostMapping("/save") @PostMapping("/save")
public void save(@RequestBody XpackEmailCreate param) throws Exception { public void save(@RequestBody XpackEmailCreate param) throws Exception {
@ -210,7 +224,7 @@ public class XEmailTaskServer {
@PostMapping("/queryInstancies/{goPage}/{pageSize}") @PostMapping("/queryInstancies/{goPage}/{pageSize}")
public Pager<List<XpackTaskInstanceDTO>> instancesGrid(@PathVariable int goPage, @PathVariable int pageSize, public Pager<List<XpackTaskInstanceDTO>> instancesGrid(@PathVariable int goPage, @PathVariable int pageSize,
@RequestBody XpackGridRequest request) { @RequestBody XpackGridRequest request) {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
Page<Object> page = PageHelper.startPage(goPage, pageSize, true); Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
List<XpackTaskInstanceDTO> instances = emailXpackService.taskInstanceGrid(request); List<XpackTaskInstanceDTO> instances = emailXpackService.taskInstanceGrid(request);
@ -227,7 +241,7 @@ public class XEmailTaskServer {
@RequiresPermissions("task-email:read") @RequiresPermissions("task-email:read")
@PostMapping("/export") @PostMapping("/export")
public void export(@RequestBody XpackGridRequest request) throws Exception{ public void export(@RequestBody XpackGridRequest request) throws Exception {
Pager<List<XpackTaskInstanceDTO>> listPager = instancesGrid(0, 0, request); Pager<List<XpackTaskInstanceDTO>> listPager = instancesGrid(0, 0, request);
List<XpackTaskInstanceDTO> instanceDTOS = listPager.getListObject(); List<XpackTaskInstanceDTO> instanceDTOS = listPager.getListObject();
ExcelSheetModel excelSheetModel = excelSheetModel(instanceDTOS); ExcelSheetModel excelSheetModel = excelSheetModel(instanceDTOS);
@ -257,7 +271,7 @@ public class XEmailTaskServer {
inputStream.close(); inputStream.close();
} catch (IOException ex) { } catch (IOException ex) {
ex.printStackTrace(); ex.printStackTrace();
}finally { } finally {
if (file.exists()) if (file.exists())
FileUtil.del(file); FileUtil.del(file);
} }
@ -267,7 +281,7 @@ public class XEmailTaskServer {
private ExcelSheetModel excelSheetModel(List<XpackTaskInstanceDTO> instanceDTOS) { private ExcelSheetModel excelSheetModel(List<XpackTaskInstanceDTO> instanceDTOS) {
ExcelSheetModel excelSheetModel = new ExcelSheetModel(); ExcelSheetModel excelSheetModel = new ExcelSheetModel();
excelSheetModel.setSheetName(Translator.get("I18N_XPACKTASK_FILE_NAME")); excelSheetModel.setSheetName(Translator.get("I18N_XPACKTASK_FILE_NAME"));
String[] headArr = new String[] {Translator.get("I18N_XPACKTASK_NAME"), Translator.get("I18N_XPACKTASK_EXEC_TIME"), Translator.get("I18N_XPACKTASK_STATUS")}; String[] headArr = new String[]{Translator.get("I18N_XPACKTASK_NAME"), Translator.get("I18N_XPACKTASK_EXEC_TIME"), Translator.get("I18N_XPACKTASK_STATUS")};
List<String> head = Arrays.asList(headArr); List<String> head = Arrays.asList(headArr);
excelSheetModel.setHeads(head); excelSheetModel.setHeads(head);
List<List<String>> data = instanceDTOS.stream().map(this::formatExcelData).collect(Collectors.toList()); List<List<String>> data = instanceDTOS.stream().map(this::formatExcelData).collect(Collectors.toList());

View File

@ -68,6 +68,11 @@ public class ScheduleService {
taskHandler.addTask(scheduleManager, task); taskHandler.addTask(scheduleManager, task);
} }
public void addTempSchedule(GlobalTaskEntity task) throws Exception {
TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType());
taskHandler.addTempTask(scheduleManager, task);
}
public void deleteSchedule(GlobalTaskEntity task) { public void deleteSchedule(GlobalTaskEntity task) {
TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType()); TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType());
taskHandler.removeTask(scheduleManager, task); taskHandler.removeTask(scheduleManager, task);

View File

@ -2536,7 +2536,8 @@ export default {
task_type: 'Task type', task_type: 'Task type',
range_view: 'Displayed data', range_view: 'Displayed data',
range_all: 'All data', range_all: 'All data',
execute_now: 'Execute now' execute_now: 'Execute now',
fire_now_success: 'Task executing'
}, },
dynamic_time: { dynamic_time: {
set_default: 'Set Default', set_default: 'Set Default',

View File

@ -2537,7 +2537,8 @@ export default {
task_type: '任務類型', task_type: '任務類型',
range_view: '展示數據', range_view: '展示數據',
range_all: '全部數據', range_all: '全部數據',
execute_now: '立即執行' execute_now: '立即執行',
fire_now_success: '任務發起成功'
}, },
dynamic_time: { dynamic_time: {
set_default: '設置默認值', set_default: '設置默認值',

View File

@ -2537,7 +2537,8 @@ export default {
task_type: '任务类型', task_type: '任务类型',
range_view: '展示数据', range_view: '展示数据',
range_all: '全部数据', range_all: '全部数据',
execute_now: '立即执行' execute_now: '立即执行',
fire_now_success: '任务发起成功'
}, },
dynamic_time: { dynamic_time: {
set_default: '设置默认值', set_default: '设置默认值',