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
*
* @param cron
* @return
*/
@ -33,6 +34,7 @@ public class CronUtils {
/**
* 获取以指定时间为开始时间的下一次执行时间
*
* @param cron
* @param start
* @return
@ -40,7 +42,7 @@ public class CronUtils {
public static Date getNextTriggerTime(String cron, Date start) {
if (start == null) {
return getNextTriggerTime(cron);
}else{
} else {
CronTrigger trigger = getCronTrigger(cron);
return trigger.getFireTimeAfter(start);
}
@ -48,19 +50,20 @@ public class CronUtils {
/**
* 获取以当前日期为准的下一次执行时间
*
* @param cron
* @return
*/
public static Date getNextTriggerTime(String cron) {
Date date = null;
try{
try {
CronTrigger trigger = getCronTrigger(cron);
Date startDate = trigger.getStartTime();
date = trigger.getFireTimeAfter(startDate);
}catch (Exception e){
} catch (Exception e) {
}
return date;
return date;
}
public static String cron(GlobalTaskEntity taskEntity) {
@ -98,6 +101,15 @@ public class CronUtils {
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) {
int index = instance.get(Calendar.DAY_OF_WEEK);
index = (index % 7) + 1;

View File

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

View File

@ -92,13 +92,14 @@ public class EmailTaskHandler extends TaskHandler implements Job {
return;
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
Boolean isTempTask = (Boolean) jobDataMap.getOrDefault(IS_TEMP_TASK, false);
GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity");
ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class);
if (CronUtils.taskExpire(taskEntity.getEndTime())) {
if (!isTempTask && CronUtils.taskExpire(taskEntity.getEndTime())) {
removeTask(scheduleManager, taskEntity);
return;
}
if (taskIsRunning(taskEntity.getTaskId())) {
if (!isTempTask && taskIsRunning(taskEntity.getTaskId())) {
LogUtil.info("Skip synchronization task: {} ,due to task status is {}",
taskEntity.getTaskId(), "running");
return;
@ -111,7 +112,10 @@ public class EmailTaskHandler extends TaskHandler implements Job {
XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate");
SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator");
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")
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);
AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class);
@ -164,7 +168,7 @@ public class EmailTaskHandler extends TaskHandler implements Job {
List<File> files = null;
try {
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);
return;
}

View File

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

View File

@ -56,7 +56,7 @@ public class XEmailTaskServer {
@RequiresPermissions("task-email:read")
@PostMapping("/queryTasks/{goPage}/{pageSize}")
public Pager<List<XpackTaskGridDTO>> queryTask(@PathVariable int goPage, @PathVariable int pageSize,
@RequestBody XpackGridRequest request) {
@RequestBody XpackGridRequest request) {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
CurrentUserDto user = AuthUtils.getUser();
@ -76,17 +76,17 @@ public class XEmailTaskServer {
tasks.forEach(item -> {
if (CronUtils.taskExpire(item.getEndTime())) {
item.setNextExecTime(null);
}else {
} else {
GlobalTaskEntity globalTaskEntity = new GlobalTaskEntity();
globalTaskEntity.setRateType(item.getRateType());
globalTaskEntity.setRateVal(item.getRateVal());
try{
try {
String cron = CronUtils.cron(globalTaskEntity);
if (StringUtils.isNotBlank(cron)) {
Long nextTime = CronUtils.getNextTriggerTime(cron).getTime();
item.setNextExecTime(nextTime);
}
}catch (Exception e) {
} catch (Exception e) {
item.setNextExecTime(null);
}
}
@ -98,6 +98,20 @@ public class XEmailTaskServer {
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")
@PostMapping("/save")
public void save(@RequestBody XpackEmailCreate param) throws Exception {
@ -210,7 +224,7 @@ public class XEmailTaskServer {
@PostMapping("/queryInstancies/{goPage}/{pageSize}")
public Pager<List<XpackTaskInstanceDTO>> instancesGrid(@PathVariable int goPage, @PathVariable int pageSize,
@RequestBody XpackGridRequest request) {
@RequestBody XpackGridRequest request) {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
List<XpackTaskInstanceDTO> instances = emailXpackService.taskInstanceGrid(request);
@ -227,7 +241,7 @@ public class XEmailTaskServer {
@RequiresPermissions("task-email:read")
@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);
List<XpackTaskInstanceDTO> instanceDTOS = listPager.getListObject();
ExcelSheetModel excelSheetModel = excelSheetModel(instanceDTOS);
@ -257,7 +271,7 @@ public class XEmailTaskServer {
inputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}finally {
} finally {
if (file.exists())
FileUtil.del(file);
}
@ -267,7 +281,7 @@ public class XEmailTaskServer {
private ExcelSheetModel excelSheetModel(List<XpackTaskInstanceDTO> instanceDTOS) {
ExcelSheetModel excelSheetModel = new ExcelSheetModel();
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);
excelSheetModel.setHeads(head);
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);
}
public void addTempSchedule(GlobalTaskEntity task) throws Exception {
TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType());
taskHandler.addTempTask(scheduleManager, task);
}
public void deleteSchedule(GlobalTaskEntity task) {
TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType());
taskHandler.removeTask(scheduleManager, task);

View File

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

View File

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

View File

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