forked from github/dataease
Merge pull request #3762 from dataease/pr@dev@feat_report_task_fire_now
feat(定时报告): 立即执行后台
This commit is contained in:
commit
32ab0b7f76
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
|
@ -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',
|
||||
|
@ -2537,7 +2537,8 @@ export default {
|
||||
task_type: '任務類型',
|
||||
range_view: '展示數據',
|
||||
range_all: '全部數據',
|
||||
execute_now: '立即執行'
|
||||
execute_now: '立即執行',
|
||||
fire_now_success: '任務發起成功'
|
||||
},
|
||||
dynamic_time: {
|
||||
set_default: '設置默認值',
|
||||
|
@ -2537,7 +2537,8 @@ export default {
|
||||
task_type: '任务类型',
|
||||
range_view: '展示数据',
|
||||
range_all: '全部数据',
|
||||
execute_now: '立即执行'
|
||||
execute_now: '立即执行',
|
||||
fire_now_success: '任务发起成功'
|
||||
},
|
||||
dynamic_time: {
|
||||
set_default: '设置默认值',
|
||||
|
Loading…
Reference in New Issue
Block a user