|
|
|
@ -4,16 +4,30 @@ import cn.estsh.i3plus.core.api.iservice.busi.ITaskTimeService;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.bean.ListPager;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.common.Pager;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.common.PagerHelper;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil;
|
|
|
|
|
import cn.estsh.i3plus.pojo.base.tool.HqlPack;
|
|
|
|
|
import cn.estsh.i3plus.pojo.platform.bean.RefExpressionTrigger;
|
|
|
|
|
import cn.estsh.i3plus.pojo.platform.bean.SessionUser;
|
|
|
|
|
import cn.estsh.i3plus.pojo.platform.bean.TaskTime;
|
|
|
|
|
import cn.estsh.i3plus.pojo.platform.bean.TaskTimeExpression;
|
|
|
|
|
import cn.estsh.i3plus.pojo.platform.repository.RefExpressionTriggerRepository;
|
|
|
|
|
import cn.estsh.i3plus.pojo.platform.repository.TaskTimeRepository;
|
|
|
|
|
import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack;
|
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
|
|
|
|
|
import cn.estsh.impp.framework.boot.exception.ImppExceptionEnum;
|
|
|
|
|
import cn.estsh.impp.framework.boot.util.ValidatorBean;
|
|
|
|
|
import org.hibernate.service.spi.ServiceException;
|
|
|
|
|
import org.quartz.*;
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.text.ParseException;
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -30,11 +44,65 @@ public class TaskTimeServiceImpl implements ITaskTimeService {
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private TaskTimeRepository taskTimeRDao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private RefExpressionTriggerRepository refExpressionTriggerRDao;
|
|
|
|
|
@Autowired
|
|
|
|
|
private Scheduler scheduler;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void updateTaskTime(TaskTime taskTime) {
|
|
|
|
|
LOGGER.info("定时任务 TASK_TIME :{}", taskTime);
|
|
|
|
|
public void updateTaskTime(TaskTime taskTime, TaskTimeExpression taskTimeExpression) {
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
|
|
|
|
|
TaskTime oldTaskTime = taskTimeRDao.getById(taskTime.getId());
|
|
|
|
|
|
|
|
|
|
// 更新关系表
|
|
|
|
|
refExpressionTriggerRDao.updateByProperties(
|
|
|
|
|
"expressionId",oldTaskTime.getTimeExpressionId(),
|
|
|
|
|
new String[]{"name","groupName"},
|
|
|
|
|
new String[]{oldTaskTime.getName(),taskTime.getGroupName()}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
taskTimeRDao.update(taskTime);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(taskTime.getName(),taskTime.getGroupName());
|
|
|
|
|
System.out.println(scheduler.getTrigger(triggerKey));
|
|
|
|
|
|
|
|
|
|
if (!scheduler.checkExists(triggerKey)) {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode())
|
|
|
|
|
.setErrorDetail("定时任务不存在")
|
|
|
|
|
.setErrorSolution("请重新选择")
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加定时任务与触发器到quartz表中
|
|
|
|
|
CronScheduleBuilder schedBuilder = CronScheduleBuilder
|
|
|
|
|
.cronSchedule(taskTimeExpression.getExpressionContent())
|
|
|
|
|
.withMisfireHandlingInstructionDoNothing();
|
|
|
|
|
TriggerBuilder<CronTrigger> trigger = TriggerBuilder.newTrigger()
|
|
|
|
|
.withIdentity(triggerKey)
|
|
|
|
|
.withDescription(taskTimeExpression.getExpressionDescription())
|
|
|
|
|
.withSchedule(schedBuilder)
|
|
|
|
|
.startAt(sdf.parse(taskTimeExpression.getExpressionStartDatetime()));
|
|
|
|
|
if(taskTimeExpression.getExpressionEndDatetime() != null){
|
|
|
|
|
trigger = trigger.endAt(sdf.parse(taskTimeExpression.getExpressionEndDatetime()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JobKey jobKey = new JobKey(taskTime.getName(), taskTime.getGroupName());
|
|
|
|
|
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
|
|
|
|
|
jobDetail.getJobBuilder().withDescription(taskTime.getTaskDescription());
|
|
|
|
|
|
|
|
|
|
HashSet<Trigger> triggerSet = new HashSet<>();
|
|
|
|
|
triggerSet.add(trigger.build());
|
|
|
|
|
|
|
|
|
|
scheduler.scheduleJob(jobDetail, triggerSet, true);
|
|
|
|
|
} catch (SchedulerException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -44,18 +112,117 @@ public class TaskTimeServiceImpl implements ITaskTimeService {
|
|
|
|
|
taskTime.setTaskStatus(status);
|
|
|
|
|
taskTime.setModifyUser(user.getUserName());
|
|
|
|
|
taskTimeRDao.update(taskTime);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(taskTime.getName(), taskTime.getGroupName());
|
|
|
|
|
if (!scheduler.checkExists(triggerKey)) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (status == CommonEnumUtil.DATA_STATUS.ENABLE.getValue()){
|
|
|
|
|
scheduler.resumeTrigger(triggerKey);
|
|
|
|
|
} else {
|
|
|
|
|
scheduler.pauseTrigger(triggerKey);
|
|
|
|
|
}
|
|
|
|
|
} catch (SchedulerException e) {
|
|
|
|
|
LOGGER.info("重新开始任务-->复杂调度" + e.getMessage());
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void deleteTaskTimeById(String id) {
|
|
|
|
|
LOGGER.info("定时任务 TASK_TIME Key:{}", id);
|
|
|
|
|
try {
|
|
|
|
|
TaskTime taskTime = taskTimeRDao.getById(Long.parseLong(id));
|
|
|
|
|
ValidatorBean.checkNotNull(taskTime,"定时任务不存在");
|
|
|
|
|
|
|
|
|
|
taskTimeRDao.deleteById(Long.parseLong(id));
|
|
|
|
|
// 删除关系表数据
|
|
|
|
|
refExpressionTriggerRDao.deleteByProperty("expressionId",taskTime.getTimeExpressionId());
|
|
|
|
|
|
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(taskTime.getName(),taskTime.getGroupName());
|
|
|
|
|
if(scheduler.checkExists(triggerKey)){
|
|
|
|
|
scheduler.pauseTrigger(triggerKey);
|
|
|
|
|
scheduler.unscheduleJob(triggerKey);
|
|
|
|
|
}else {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode())
|
|
|
|
|
.setErrorDetail("定时任务不存在")
|
|
|
|
|
.setErrorSolution("请重新选择")
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
} catch (SchedulerException e) {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.TASK_EXCEPTION.getCode())
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public TaskTime insertTaskTime(TaskTime taskTime) {
|
|
|
|
|
LOGGER.info("定时任务 TASK_TIME :{}", taskTime);
|
|
|
|
|
return taskTimeRDao.insert(taskTime);
|
|
|
|
|
public TaskTime insertTaskTime(TaskTime taskTime, TaskTimeExpression taskTimeExpression) {
|
|
|
|
|
try {
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
// 唯一校验
|
|
|
|
|
JobKey jobKey = JobKey.jobKey(taskTime.getName(),taskTime.getGroupName());
|
|
|
|
|
TriggerKey triggerKey = TriggerKey.triggerKey(taskTime.getName(),taskTime.getGroupName());
|
|
|
|
|
if (taskTimeRDao.isExitByProperty(new String[]{"name","groupName"},new String[]{taskTime.getName(),taskTime.getGroupName()})
|
|
|
|
|
|| scheduler.checkExists(jobKey) || scheduler.checkExists(triggerKey)){
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_EXIT.getCode())
|
|
|
|
|
.setErrorDetail("定时任务已存在")
|
|
|
|
|
.setErrorSolution("请重新输入任务名称和组名称")
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RefExpressionTrigger refExpressionTrigger = new RefExpressionTrigger();
|
|
|
|
|
refExpressionTrigger.setExpressionId(taskTimeExpression.getId());
|
|
|
|
|
refExpressionTrigger.setTriggerName(taskTime.getName());
|
|
|
|
|
refExpressionTrigger.setTriggerGroupName(taskTime.getGroupName());
|
|
|
|
|
|
|
|
|
|
taskTime = taskTimeRDao.insert(taskTime);
|
|
|
|
|
// 添加表达式与触发器关系表
|
|
|
|
|
refExpressionTriggerRDao.insert(refExpressionTrigger);
|
|
|
|
|
|
|
|
|
|
// 添加定时任务与触发器到quartz表中
|
|
|
|
|
CronScheduleBuilder schedBuilder = CronScheduleBuilder
|
|
|
|
|
.cronSchedule(taskTimeExpression.getExpressionContent())
|
|
|
|
|
.withMisfireHandlingInstructionDoNothing();
|
|
|
|
|
TriggerBuilder<CronTrigger> trigger = TriggerBuilder.newTrigger()
|
|
|
|
|
.withIdentity(triggerKey)
|
|
|
|
|
.withDescription(taskTimeExpression.getExpressionDescription())
|
|
|
|
|
.withSchedule(schedBuilder)
|
|
|
|
|
.startAt(sdf.parse(taskTimeExpression.getExpressionStartDatetime()));
|
|
|
|
|
if(taskTimeExpression.getExpressionEndDatetime() != null){
|
|
|
|
|
trigger = trigger.endAt(sdf.parse(taskTimeExpression.getExpressionEndDatetime()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Class<? extends Job> clazz = (Class<? extends Job>) Class.forName(taskTime.getTaskPackage() + "." + taskTime.getTaskClass());
|
|
|
|
|
JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(jobKey).withDescription(taskTime.getTaskDescription()).build();
|
|
|
|
|
|
|
|
|
|
scheduler.scheduleJob(jobDetail, trigger.build());
|
|
|
|
|
} catch (SchedulerException e) {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.TASK_EXCEPTION.getCode())
|
|
|
|
|
.build();
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_FORMAT.getCode())
|
|
|
|
|
.setErrorDetail("表达式起止时间错误")
|
|
|
|
|
.setErrorSolution("请更改表达式起止时间")
|
|
|
|
|
.build();
|
|
|
|
|
} catch (ClassNotFoundException e) {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode())
|
|
|
|
|
.setErrorDetail("定时任务包名及类名不正确")
|
|
|
|
|
.setErrorSolution("请重新输入定时任务包名及类名")
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
return taskTime;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -104,5 +271,33 @@ public class TaskTimeServiceImpl implements ITaskTimeService {
|
|
|
|
|
taskTimeRDao.updateByHqlWhere(where.toString(), "taskStatus", status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void doTaskTimeLastDateByNameAndGroupName(String lastDate, String name, String groupName) {
|
|
|
|
|
taskTimeRDao.updateByProperties(
|
|
|
|
|
new String[]{"name","groupName"},new String[]{name,groupName},
|
|
|
|
|
"lastRunDateTime",lastDate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void executeTaskTimeById(long id) {
|
|
|
|
|
TaskTime taskTime = taskTimeRDao.getById(id);
|
|
|
|
|
JobKey jobKey = JobKey.jobKey(taskTime.getName(),taskTime.getGroupName());
|
|
|
|
|
try {
|
|
|
|
|
if (scheduler.checkExists(jobKey)) {
|
|
|
|
|
scheduler.triggerJob(jobKey);
|
|
|
|
|
} else {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode())
|
|
|
|
|
.setErrorDetail("定时任务不存在")
|
|
|
|
|
.setErrorSolution("请重新输入任务名称和组名称")
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
} catch (SchedulerException e) {
|
|
|
|
|
throw ImppExceptionBuilder.newInstance()
|
|
|
|
|
.setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode())
|
|
|
|
|
.setErrorCode(ImppExceptionEnum.TASK_EXCEPTION.getCode())
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|