From ec137693cfbefe254092e40979b2dbda4505f399 Mon Sep 17 00:00:00 2001 From: "yunhao.wang" Date: Thu, 15 Nov 2018 10:05:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90=20=E8=A1=A8=E8=BE=BE=E5=BC=8F=20=20=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90=20=E9=82=AE=E4=BB=B6=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/api/iservice/busi/ITaskTimeService.java | 31 ++- modules/i3plus-core-apiservice/pom.xml | 5 + .../controller/DemoScheduleController.java | 2 +- .../controller/busi/TaskTimeController.java | 87 ++++++--- .../core/apiservice/schedulejob/DemoJob.java | 17 ++ .../busi/TaskTimeExpressionServiceImpl.java | 5 + .../serviceimpl/busi/TaskTimeServiceImpl.java | 209 ++++++++++++++++++++- .../i3plus/core/apiservice/util/MailUtil.java | 202 ++++++++++++++++++++ .../src/main/resources/mail.properties | 5 + .../serviceimpl/busi/TestTaskTimeService.java | 11 +- .../serviceimpl/busi/TestToolService.java | 4 +- pom.xml | 6 + 12 files changed, 530 insertions(+), 54 deletions(-) create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/MailUtil.java create mode 100644 modules/i3plus-core-apiservice/src/main/resources/mail.properties diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITaskTimeService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITaskTimeService.java index 67844e6..d49685c 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITaskTimeService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ITaskTimeService.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; 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 java.util.List; @@ -17,10 +18,17 @@ import java.util.List; public interface ITaskTimeService { /** + * 新增数据 + * @param taskTime + * @return + */ + TaskTime insertTaskTime(TaskTime taskTime, TaskTimeExpression taskTimeExpression); + + /** * 修改数据 * @param taskTime */ - void updateTaskTime(TaskTime taskTime); + void updateTaskTime(TaskTime taskTime, TaskTimeExpression taskTimeExpression); /** * 修改任务状态 @@ -37,13 +45,6 @@ public interface ITaskTimeService { void deleteTaskTimeById(String id); /** - * 新增数据 - * @param taskTime - * @return - */ - TaskTime insertTaskTime(TaskTime taskTime); - - /** * 查询所有数据 * @return */ @@ -76,4 +77,18 @@ public interface ITaskTimeService { * */ void updateTaskTimeStatusByIds(String[] ids, Integer status); + + /** + * 修改最后时间 + * @param lastDate + * @param name + * @param groupName + */ + void doTaskTimeLastDateByNameAndGroupName(String lastDate,String name,String groupName); + + /** + * 立即执行 + * @param idStr + */ + void executeTaskTimeById(long idStr); } diff --git a/modules/i3plus-core-apiservice/pom.xml b/modules/i3plus-core-apiservice/pom.xml index 2ff810d..c0374d9 100644 --- a/modules/i3plus-core-apiservice/pom.xml +++ b/modules/i3plus-core-apiservice/pom.xml @@ -112,6 +112,11 @@ junit test + + + javax.mail + mail + diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/DemoScheduleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/DemoScheduleController.java index 5200db6..c269622 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/DemoScheduleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/DemoScheduleController.java @@ -39,7 +39,7 @@ public class DemoScheduleController { System.out.println(ti); } - return new ResultBean(true,""); + return new ResultBean(true,"").setResultList(taskList); } @GetMapping(value="/add-task") diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/TaskTimeController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/TaskTimeController.java index 78bf797..dd92872 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/TaskTimeController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/TaskTimeController.java @@ -46,28 +46,33 @@ public class TaskTimeController { @PostMapping(value = "/insert") @ApiOperation(value = "新增定时任务", notes = "定时任务") - public ResultBean insertTaskTime(TaskTime taskTime) { + public ResultBean insertTaskTime(TaskTime taskTime,Boolean isExecute) { try { // 数据校验 ValidatorBean.beginValid(taskTime) - .notNull("timeId", taskTime.getTimeId()) .notNull("name", taskTime.getName()) - .notNull("timeId",taskTime.getTimeId()) - .notNull("taskMethodTypeId", taskTime.getTaskMethodTypeId()); + .notNull("groupName",taskTime.getGroupName()) + .notNull("timeExpressionId",taskTime.getTimeExpressionId()) + .notNull("taskMethodTypeId", taskTime.getTaskMethodTypeId()) + .notNull("taskPackage",taskTime.getTaskPackage()) + .notNull("taskClass",taskTime.getTaskClass()); - TaskTimeExpression taskTimeExpression = taskTimeExpressionService.getTaskTimeExpressionById(taskTime.getTimeId().toString()); - ValidatorBean.beginValid(taskTimeExpression); + TaskTimeExpression taskTimeExpression = taskTimeExpressionService + .getTaskTimeExpressionById(taskTime.getTimeExpressionId().toString()); + ValidatorBean.checkNotNull(taskTimeExpression,"定时执行策略不存在"); - taskTime.setRedTimeName(taskTimeExpression.getName()); - taskTime.setRedTimeExpression(taskTimeExpression.getExpressionContent()); + taskTime.setTimeExpressionNameRdd(taskTimeExpression.getName()); + taskTime.setTimeExpressionContentRdd(taskTimeExpression.getExpressionContent()); + taskTime.setTaskStartDateTimeRdd(taskTimeExpression.getExpressionStartDatetime()); + taskTime.setTaskEndDateTimeRdd(taskTimeExpression.getExpressionEndDatetime()); taskTime.setTaskStatus(CommonEnumUtil.DATA_STATUS.ENABLE.getValue()); - ConvertBean.modelInitialize(taskTime, AuthUtil.getSessionUser()); - - taskTime = taskTimeService.insertTaskTime(taskTime); - return ResultBean.success("操作成功") - .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) - .setResultObject(taskTime); + taskTime = taskTimeService.insertTaskTime(taskTime,taskTimeExpression); + // 立即执行 + if(isExecute != null && isExecute){ + taskTimeService.executeTaskTimeById(taskTime.getId()); + } + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(taskTime); } catch (ImppBusiException busExcep) { LOGGER.error(busExcep.getErrorMsg() + ":{}", busExcep.getErrorDetail(), busExcep); return ResultBean.fail(busExcep.getErrorShow()); @@ -79,31 +84,33 @@ public class TaskTimeController { @PutMapping(value = "/update") @ApiOperation(value = "修改定时任务", notes = "定时任务") - public ResultBean updateTaskTime(TaskTime taskTime) { + public ResultBean updateTaskTime(TaskTime taskTime,Boolean isExecute) { try { // 数据校验 ValidatorBean.beginValid(taskTime) .notNull("id", taskTime.getId()) - .notNull("timeId", taskTime.getTimeId()) .notNull("name", taskTime.getName()) - .notNull("taskMethodTypeId",taskTime.getTaskMethodTypeId()); - - TaskTimeExpression taskTimeExpression = taskTimeExpressionService.getTaskTimeExpressionById(taskTime.getTimeId().toString()); - - // 数据真实性校验 - ValidatorBean.beginValid(taskTimeExpression); + .notNull("groupName",taskTime.getGroupName()) + .notNull("timeExpressionId",taskTime.getTimeExpressionId()) + .notNull("taskMethodTypeId", taskTime.getTaskMethodTypeId()) + .notNull("taskPackage",taskTime.getTaskPackage()) + .notNull("taskClass",taskTime.getTaskClass()); - // 数据冗余 - taskTime.setRedTimeName(taskTimeExpression.getName()); - taskTime.setRedTimeExpression(taskTimeExpression.getExpressionContent()); + TaskTimeExpression taskTimeExpression = taskTimeExpressionService + .getTaskTimeExpressionById(taskTime.getTimeExpressionId().toString()); + ValidatorBean.checkNotNull(taskTimeExpression,"定时执行策略不存在"); - ConvertBean.modelUpdate(taskTime, AuthUtil.getSessionUser()); - - taskTimeService.updateTaskTime(taskTime); + taskTime.setTimeExpressionNameRdd(taskTimeExpression.getName()); + taskTime.setTimeExpressionContentRdd(taskTimeExpression.getExpressionContent()); + taskTime.setTaskStartDateTimeRdd(taskTimeExpression.getExpressionStartDatetime()); + taskTime.setTaskEndDateTimeRdd(taskTimeExpression.getExpressionEndDatetime()); + taskTime.setTaskStatus(CommonEnumUtil.DATA_STATUS.ENABLE.getValue()); - return ResultBean.success("操作成功") - .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) - .setResultObject(taskTime); + taskTimeService.updateTaskTime(taskTime,taskTimeExpression); + if(isExecute != null && isExecute){ + taskTimeService.executeTaskTimeById(taskTime.getId()); + } + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(taskTime); } catch (ImppBusiException busExcep) { LOGGER.error(busExcep.getErrorMsg() + ":{}", busExcep.getErrorDetail(), busExcep); return ResultBean.fail(busExcep.getErrorShow()); @@ -250,4 +257,22 @@ public class TaskTimeController { return ResultBean.fail().setCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()); } } + + @GetMapping(value = "/execute/{id}") + @ApiOperation(value = "立即执行", notes = "立即执行") + public ResultBean executeByTaskTimeId(@PathVariable("id") String id) { + try { + // 数据校验 + ValidatorBean.checkNotNull(id, "定时任务id 不能为空"); + + taskTimeService.executeTaskTimeById(Long.parseLong(id)); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException busExcep) { + LOGGER.error(busExcep.getErrorMsg() + ":{}", busExcep.getErrorDetail(), busExcep); + return ResultBean.fail(busExcep.getErrorShow()); + } catch (Exception e) { + LOGGER.error(ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription() + ":{}", e.getMessage(), e); + return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/DemoJob.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/DemoJob.java index 6581bb5..050b0da 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/DemoJob.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/DemoJob.java @@ -1,11 +1,19 @@ package cn.estsh.i3plus.core.apiservice.schedulejob; +import cn.estsh.i3plus.core.api.iservice.busi.ITaskTimeService; +import cn.estsh.i3plus.pojo.platform.repository.TaskTimeRepository; import cn.estsh.impp.framework.base.schedule.BaseImppScheduleJob; import cn.estsh.impp.framework.boot.init.ApplicationProperties; import io.swagger.annotations.ApiOperation; import org.quartz.JobExecutionContext; +import org.quartz.Scheduler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.text.SimpleDateFormat; +import java.util.Date; /** * @Description : 定时任务 @@ -18,12 +26,21 @@ import org.slf4j.LoggerFactory; public class DemoJob extends BaseImppScheduleJob { public static final Logger LOGGER = LoggerFactory.getLogger(DemoJob.class); + @Autowired + private ITaskTimeService taskTimeService; + public DemoJob() { super(DemoJob.class,"定时任务demo"); } @Override public void executeImppJob(JobExecutionContext context, ApplicationProperties applicationProperties) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:dd"); + + taskTimeService.doTaskTimeLastDateByNameAndGroupName(sdf.format(new Date()), + context.getJobDetail().getKey().getName(), + context.getJobDetail().getKey().getGroup()); + System.out.println("定时任务被执行"); LOGGER.info("projectName:{},port:{}",applicationProperties.getApplicationName(),applicationProperties.getServerPort()); } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TaskTimeExpressionServiceImpl.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TaskTimeExpressionServiceImpl.java index b2dcc26..b17799f 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TaskTimeExpressionServiceImpl.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TaskTimeExpressionServiceImpl.java @@ -12,11 +12,14 @@ 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 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.List; /** @@ -51,6 +54,8 @@ public class TaskTimeExpressionServiceImpl implements ITaskTimeExpressionService @Override public TaskTimeExpression insertTaskTimeExpression(TaskTimeExpression taskTimeExpression) { LOGGER.info("定时任务时间表达式 TASK_TIME_EXPRESSION :{}", taskTimeExpression); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return taskTimeExpressionRDao.insert(taskTimeExpression); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TaskTimeServiceImpl.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TaskTimeServiceImpl.java index e5a5fcc..223baa4 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TaskTimeServiceImpl.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TaskTimeServiceImpl.java @@ -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 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 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); - taskTimeRDao.deleteById(Long.parseLong(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 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 clazz = (Class) 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(); + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/MailUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/MailUtil.java new file mode 100644 index 0000000..10e1446 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/MailUtil.java @@ -0,0 +1,202 @@ +package cn.estsh.i3plus.core.apiservice.util; + +import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.support.PropertiesLoaderUtils; +import sun.misc.BASE64Encoder; + +import javax.mail.*; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.io.IOException; +import java.util.Properties; + +/** + * @Description : 邮件工具类 + * @Reference : + * @Author : yunhao + * @CreateDate : 2018-11-14 19:24 + * @Modify: + **/ +public class MailUtil { + public static final Logger LOGGER = LoggerFactory.getLogger(MailUtil.class); + + // 收件人 + private Address[] to = null; + private Address[] cc = null; + private String from = ""; + private String nick = ""; + private String title = ""; + private String content = ""; + private String smtpHost = ""; + private int smtpPort = 25; + private String content_type = ""; + + private String smtpUser = ""; + private String smtpPassword = ""; + private boolean isAuthenticationSMTP = false; + + + //初始化服务器邮箱参数 + public MailUtil() { + try { + Properties mailInfo = PropertiesLoaderUtils.loadAllProperties("mail.properties"); + this.smtpHost = mailInfo.get("mail.host").toString(); + this.smtpPort = Integer.parseInt(mailInfo.get("mail.port").toString()); + this.from = mailInfo.get("mail.user") + ""; + this.nick = mailInfo.get("mail.nick") + ""; + this.smtpUser = mailInfo.get("mail.user") + ""; + this.smtpPassword = mailInfo.get("mail.password") + ""; + this.isAuthenticationSMTP = true; + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 设置收件人地址 + * + * @param aEmail + * 收件人Email地址 + */ + public void setTo(String aEmail) { + String[] s = new String[1]; + s[0] = aEmail; + this.to = getAddress(s); + } + + /** + * 设置多个收件人地址 + * + * @param Emails + * 收件人Email地址 + */ + public void setTo(String[] Emails) { + this.to = getAddress(Emails); + } + + /** + * 设置抄送地址 + * + * @param aEmail + * 抄送地址 + */ + public void setCC(String aEmail) { + String[] s = new String[1]; + s[0] = aEmail; + this.cc = getAddress(s); + } + + /** + * 设置多个抄送地址 + * + * @param Emails + * 抄送地址 + */ + public void setCC(String[] Emails) { + this.cc = getAddress(Emails); + } + + /** + * 设置邮件主题 + * + * @param mailTitle + * 邮件主题 + */ + public void setSubject(String mailTitle) { + this.title = mailTitle; + } + + /** + * 设置邮件文字内容 + * + * @param mailContent + * 邮件文字内容 + */ + public void setBody(String mailContent) { + this.content = mailContent; + } + + /** + * 设置邮件字符类型 + * + * @param contentType + * 请从CommonConstWords.MAIL_MODE_TEXT和MAIL_MODE_HTML中选择 + */ + public void setContentType(String contentType) { + this.content_type = contentType; + } + + private Address[] getAddress(String[] add) { + Address[] a = new Address[add.length]; + for (int i = 0; i < add.length; i++) { + try { + a[i] = new InternetAddress(add[i]); + } catch (AddressException ex) { + ex.printStackTrace(); + } + } + return a; + } + /** + * 发送邮件 + */ + public void send() { + try { + // 乱码 + BASE64Encoder enc = new BASE64Encoder(); + + Properties server = new Properties(); + server.put("mail.smtp.port", String.valueOf(this.smtpPort)); + server.put("mail.smtp.host", this.smtpHost); + if (this.isAuthenticationSMTP) { + server.put("mail.smtp.auth", "true"); + } + + Session conn = Session.getInstance(server, null); + + MimeMessage msg = new MimeMessage(conn); + if (nick != null && !"".equals(nick)) { + msg.setSubject("=?GB2312?B?" + enc.encode(nick.getBytes())+ "?="); + msg.setFrom(new InternetAddress(nick + " <" + from + ">")); + } else { + msg.setFrom(new InternetAddress(this.from)); + } + // 收件人 + if (this.to != null) { + msg.setRecipients(Message.RecipientType.TO, this.to); + } + // 抄送 + if (this.cc != null) { + msg.setRecipients(Message.RecipientType.CC, this.cc); + } + + msg.setSubject("=?GB2312?B?" + enc.encode(this.title.getBytes())+ "?="); + msg.setSubject(this.title); + + // 是HTML格式的邮件 + msg.setContent(this.content, this.content_type); + + msg.saveChanges(); + if (this.isAuthenticationSMTP) { + Transport transport = conn.getTransport("smtp"); + transport.connect(this.smtpHost, this.smtpUser, this.smtpPassword); + transport.sendMessage(msg, msg.getAllRecipients()); + transport.close(); + } else { + Transport.send(msg, msg.getAllRecipients()); + } + LOGGER.info("邮件发送成功"); + } catch (javax.mail.internet.AddressException e) { + e.printStackTrace(); + } catch (MessagingException e) { + e.printStackTrace(); + } + } + + public boolean isHtmlModeMail() { + return this.content_type.equals(CommonConstWords.MAIL_MODE_HTML); + } +} diff --git a/modules/i3plus-core-apiservice/src/main/resources/mail.properties b/modules/i3plus-core-apiservice/src/main/resources/mail.properties new file mode 100644 index 0000000..88178ae --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/resources/mail.properties @@ -0,0 +1,5 @@ +mail.host = smtphm.qiye.163.com +mail.port = 25 +mail.user = dongshang@estsh.com +mail.password = Aa111111 +mail.nick = 东尚消息 \ No newline at end of file diff --git a/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTaskTimeService.java b/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTaskTimeService.java index 98b07ed..202f728 100644 --- a/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTaskTimeService.java +++ b/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestTaskTimeService.java @@ -56,17 +56,16 @@ public class TestTaskTimeService extends TestBase { public void testInsertTaskTime() { TaskTime taskTime = new TaskTime(); taskTime.setName("时间表达式"); - taskTime.setTimeId(1L); - taskTime.setTaskStartDateTime("2018-01-01 00:00:00"); - taskTime.setTaskEndDateTime("2018-12-31 00:00:00"); - taskTime.setLastRunDateTime("2018-11-03 00:00:00"); + taskTime.setTimeExpressionId(1L); + taskTime.setTaskStartDateTimeRdd("2018-01-01 00:00:00"); + taskTime.setTaskEndDateTimeRdd("2018-12-31 00:00:00"); taskTime.setTaskTypeId(ImppEnumUtil.TASK_METHOD_TYPE.TYPE_GROUP.getValue()); taskTime.setTaskStatus(CommonEnumUtil.DATA_STATUS.ENABLE.getValue()); for (int i = 0; i < 50; i++) { taskTime.setId(null); taskTime.setName("时间表达式"+i); - taskTimeService.insertTaskTime(taskTime); + taskTimeService.insertTaskTime(taskTime,null); } System.out.println(JSON.toJSONString(taskTime)); } @@ -80,7 +79,7 @@ public class TestTaskTimeService extends TestBase { TaskTime taskTime = taskTimeService.getTaskTimeById("1057110613261684736"); taskTime.setName("测试修改"); - taskTimeService.updateTaskTime(taskTime); + taskTimeService.updateTaskTime(taskTime,null); } /** diff --git a/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestToolService.java b/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestToolService.java index cc14785..29797c2 100644 --- a/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestToolService.java +++ b/modules/i3plus-core-apiservice/src/test/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/TestToolService.java @@ -78,8 +78,10 @@ public class TestToolService extends TestBase { public void testUpdateTool(){ Tool tool = toolService.getToolById("1057110613261684736"); tool.setName("测试修改"); + if(tool != null){ + toolService.updateTool(tool); + } - toolService.updateTool(tool); } /** diff --git a/pom.xml b/pom.xml index fb6a0f1..98ff20e 100644 --- a/pom.xml +++ b/pom.xml @@ -170,6 +170,12 @@ 4.12 test + + + javax.mail + mail + 1.4.7 +