diff --git a/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js b/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js index 2b030c32..59c705f6 100644 --- a/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js +++ b/ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js @@ -196,7 +196,7 @@ var pageNumber = table.pageNumber; return pageSize * (pageNumber - 1) + index + 1; }, - // 列超出指定长度浮动提示(单击文本复制列) + // 列超出指定长度浮动提示(单击文本复制) tooltip: function (value, length) { var _length = $.common.isEmpty(length) ? 20 : length; var _text = ""; @@ -386,7 +386,7 @@ var actions = []; $.each(datas, function(index, dict) { if (dict.dictValue == ('' + value)) { - var listClass = $.common.equals("default", dict.listClass) ? "" : "badge badge-" + dict.listClass; + var listClass = $.common.equals("default", dict.listClass) || $.common.isEmpty(dict.listClass) ? "" : "badge badge-" + dict.listClass; actions.push($.common.sprintf("%s", listClass, dict.dictLabel)); return false; } diff --git a/ruoyi-admin/src/main/resources/templates/system/user/add.html b/ruoyi-admin/src/main/resources/templates/system/user/add.html index f5d1e2eb..6d270cf3 100644 --- a/ruoyi-admin/src/main/resources/templates/system/user/add.html +++ b/ruoyi-admin/src/main/resources/templates/system/user/add.html @@ -71,11 +71,9 @@
-
- -
+
diff --git a/ruoyi-admin/src/main/resources/templates/system/user/edit.html b/ruoyi-admin/src/main/resources/templates/system/user/edit.html index acef2c50..e10e45a7 100644 --- a/ruoyi-admin/src/main/resources/templates/system/user/edit.html +++ b/ruoyi-admin/src/main/resources/templates/system/user/edit.html @@ -85,11 +85,9 @@
-
- -
+
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java index 8c8141e9..461cbb25 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java @@ -127,7 +127,7 @@ public class SysJobController extends BaseController @ResponseBody public AjaxResult addSave(SysJob job) throws SchedulerException, TaskException { - return toAjax(jobService.insertJobCron(job)); + return toAjax(jobService.insertJob(job)); } /** @@ -149,7 +149,7 @@ public class SysJobController extends BaseController @ResponseBody public AjaxResult editSave(SysJob job) throws SchedulerException, TaskException { - return toAjax(jobService.updateJobCron(job)); + return toAjax(jobService.updateJob(job)); } /** diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java index de10afd8..84c11151 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java @@ -31,24 +31,20 @@ public class SysJob extends BaseEntity implements Serializable @Excel(name = "任务组名") private String jobGroup; - /** 任务方法 */ - @Excel(name = "任务方法") - private String methodName; - - /** 方法参数 */ - @Excel(name = "方法参数") - private String methodParams; + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; /** cron执行表达式 */ @Excel(name = "执行表达式 ") private String cronExpression; /** cron计划策略 */ - @Excel(name = "计划策略 ") + @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; /** 是否并发执行(0允许 1禁止) */ - @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") + @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") private String concurrent; /** 任务状态(0正常 1暂停) */ @@ -85,24 +81,14 @@ public class SysJob extends BaseEntity implements Serializable this.jobGroup = jobGroup; } - public String getMethodName() - { - return methodName; - } - - public void setMethodName(String methodName) + public String getInvokeTarget() { - this.methodName = methodName; + return invokeTarget; } - public String getMethodParams() + public void setInvokeTarget(String invokeTarget) { - return methodParams; - } - - public void setMethodParams(String methodParams) - { - this.methodParams = methodParams; + this.invokeTarget = invokeTarget; } public String getCronExpression() @@ -153,15 +139,13 @@ public class SysJob extends BaseEntity implements Serializable { this.status = status; } - + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("jobId", getJobId()) .append("jobName", getJobName()) .append("jobGroup", getJobGroup()) - .append("methodName", getMethodName()) - .append("methodParams", getMethodParams()) .append("cronExpression", getCronExpression()) .append("nextValidTime", getNextValidTime()) .append("misfirePolicy", getMisfirePolicy()) diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java index 9356629c..f044aea7 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java @@ -27,13 +27,9 @@ public class SysJobLog extends BaseEntity @Excel(name = "任务组名") private String jobGroup; - /** 任务方法 */ - @Excel(name = "任务方法") - private String methodName; - - /** 方法参数 */ - @Excel(name = "方法参数") - private String methodParams; + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; /** 日志信息 */ @Excel(name = "日志信息") @@ -83,24 +79,14 @@ public class SysJobLog extends BaseEntity this.jobGroup = jobGroup; } - public String getMethodName() - { - return methodName; - } - - public void setMethodName(String methodName) + public String getInvokeTarget() { - this.methodName = methodName; + return invokeTarget; } - public String getMethodParams() + public void setInvokeTarget(String invokeTarget) { - return methodParams; - } - - public void setMethodParams(String methodParams) - { - this.methodParams = methodParams; + this.invokeTarget = invokeTarget; } public String getJobMessage() @@ -132,7 +118,7 @@ public class SysJobLog extends BaseEntity { this.exceptionInfo = exceptionInfo; } - + public Date getStartTime() { return startTime; @@ -159,8 +145,6 @@ public class SysJobLog extends BaseEntity .append("jobLogId", getJobLogId()) .append("jobName", getJobName()) .append("jobGroup", getJobGroup()) - .append("methodName", getMethodName()) - .append("methodParams", getMethodParams()) .append("jobMessage", getJobMessage()) .append("status", getStatus()) .append("exceptionInfo", getExceptionInfo()) diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java index 1e94f5ec..ce495329 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java @@ -77,20 +77,20 @@ public interface ISysJobService public void run(SysJob job) throws SchedulerException; /** - * 新增任务表达式 + * 新增任务 * * @param job 调度信息 * @return 结果 */ - public int insertJobCron(SysJob job) throws SchedulerException, TaskException; + public int insertJob(SysJob job) throws SchedulerException, TaskException; /** - * 更新任务的时间表达式 + * 更新任务 * * @param job 调度信息 * @return 结果 */ - public int updateJobCron(SysJob job) throws SchedulerException, TaskException; + public int updateJob(SysJob job) throws SchedulerException, TaskException; /** * 校验cron表达式是否有效 @@ -99,4 +99,4 @@ public interface ISysJobService * @return 结果 */ public boolean checkCronExpressionIsValid(String cronExpression); -} +} \ No newline at end of file diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java index da28feef..29a9eb54 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java @@ -2,6 +2,8 @@ package com.ruoyi.quartz.service.impl; import java.util.List; import javax.annotation.PostConstruct; +import org.quartz.JobDataMap; +import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; @@ -31,7 +33,8 @@ public class SysJobServiceImpl implements ISysJobService private SysJobMapper jobMapper; /** - * 项目启动时,初始化定时器 + * 项目启动时,初始化定时器 + * 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据) */ @PostConstruct public void init() throws SchedulerException, TaskException @@ -39,7 +42,7 @@ public class SysJobServiceImpl implements ISysJobService List jobList = jobMapper.selectJobAll(); for (SysJob job : jobList) { - ScheduleUtils.updateScheduleJob(scheduler, job); + updateSchedulerJob(job, job.getJobGroup()); } } @@ -76,11 +79,13 @@ public class SysJobServiceImpl implements ISysJobService @Transactional public int pauseJob(SysJob job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); int rows = jobMapper.updateJob(job); if (rows > 0) { - ScheduleUtils.pauseJob(scheduler, job.getJobId()); + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); } return rows; } @@ -94,11 +99,13 @@ public class SysJobServiceImpl implements ISysJobService @Transactional public int resumeJob(SysJob job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); int rows = jobMapper.updateJob(job); if (rows > 0) { - ScheduleUtils.resumeJob(scheduler, job.getJobId()); + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); } return rows; } @@ -112,10 +119,12 @@ public class SysJobServiceImpl implements ISysJobService @Transactional public int deleteJob(SysJob job) throws SchedulerException { - int rows = jobMapper.deleteJobById(job.getJobId()); + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); if (rows > 0) { - ScheduleUtils.deleteScheduleJob(scheduler, job.getJobId()); + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); } return rows; } @@ -169,7 +178,13 @@ public class SysJobServiceImpl implements ISysJobService @Transactional public void run(SysJob job) throws SchedulerException { - ScheduleUtils.run(scheduler, selectJobById(job.getJobId())); + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + SysJob properties = selectJobById(job.getJobId()); + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); + scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, jobGroup), dataMap); } /** @@ -179,7 +194,7 @@ public class SysJobServiceImpl implements ISysJobService */ @Override @Transactional - public int insertJobCron(SysJob job) throws SchedulerException, TaskException + public int insertJob(SysJob job) throws SchedulerException, TaskException { job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); int rows = jobMapper.insertJob(job); @@ -197,16 +212,36 @@ public class SysJobServiceImpl implements ISysJobService */ @Override @Transactional - public int updateJobCron(SysJob job) throws SchedulerException, TaskException + public int updateJob(SysJob job) throws SchedulerException, TaskException { + SysJob properties = selectJobById(job.getJobId()); int rows = jobMapper.updateJob(job); if (rows > 0) { - ScheduleUtils.updateScheduleJob(scheduler, job); + updateSchedulerJob(job, properties.getJobGroup()); } return rows; } + /** + * 更新任务 + * + * @param job 任务对象 + * @param jobGroup 任务组名 + */ + public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException + { + Long jobId = job.getJobId(); + // 判断是否存在 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, job); + } + /** * 校验cron表达式是否有效 * @@ -218,4 +253,4 @@ public class SysJobServiceImpl implements ISysJobService { return CronUtils.isValid(cronExpression); } -} +} \ No newline at end of file diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java index a8dc9e11..25d1ddd0 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java @@ -1,6 +1,7 @@ package com.ruoyi.quartz.task; import org.springframework.stereotype.Component; +import com.ruoyi.common.utils.StringUtils; /** * 定时任务调度测试 @@ -10,6 +11,11 @@ import org.springframework.stereotype.Component; @Component("ryTask") public class RyTask { + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) + { + System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); + } + public void ryParams(String params) { System.out.println("执行有参方法:" + params); diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java index 7cd0893e..a6f3dc4e 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java @@ -76,8 +76,7 @@ public abstract class AbstractQuartzJob implements Job final SysJobLog sysJobLog = new SysJobLog(); sysJobLog.setJobName(sysJob.getJobName()); sysJobLog.setJobGroup(sysJob.getJobGroup()); - sysJobLog.setMethodName(sysJob.getMethodName()); - sysJobLog.setMethodParams(sysJob.getMethodParams()); + sysJobLog.setInvokeTarget(sysJob.getInvokeTarget()); sysJobLog.setStartTime(startTime); sysJobLog.setEndTime(new Date()); long runMs = sysJobLog.getEndTime().getTime() - sysJobLog.getStartTime().getTime(); diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java index c126951d..5519c672 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java @@ -2,6 +2,8 @@ package com.ruoyi.quartz.util; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.quartz.domain.SysJob; @@ -20,11 +22,21 @@ public class JobInvokeUtil */ public static void invokeMethod(SysJob sysJob) throws Exception { - Object bean = SpringUtils.getBean(sysJob.getJobName()); - String methodName = sysJob.getMethodName(); - String methodParams = sysJob.getMethodParams(); + String invokeTarget = sysJob.getInvokeTarget(); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); - invokeSpringBean(bean, methodName, methodParams); + if (!isValidClassName(beanName)) + { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } + else + { + Object bean = Class.forName(beanName).newInstance(); + invokeMethod(bean, methodName, methodParams); + } } /** @@ -34,14 +46,14 @@ public class JobInvokeUtil * @param methodName 方法名称 * @param methodParams 方法参数 */ - private static void invokeSpringBean(Object bean, String methodName, String methodParams) + private static void invokeMethod(Object bean, String methodName, List methodParams) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { - if (StringUtils.isNotEmpty(methodParams)) + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) { - Method method = bean.getClass().getDeclaredMethod(methodName, String.class); - method.invoke(bean, methodParams); + Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); } else { @@ -49,4 +61,122 @@ public class JobInvokeUtil method.invoke(bean); } } + + /** + * 校验是否为为class包名 + * + * @param str 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) + { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) + { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) + { + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) + { + return null; + } + String[] methodParams = methodStr.split(","); + List classs = new LinkedList<>(); + for (int i = 0; i < methodParams.length; i++) + { + String str = StringUtils.trimToEmpty(methodParams[i]); + // String字符串类型,包含' + if (StringUtils.contains(str, "'")) + { + classs.add(new Object[] { StringUtils.replace(str, "'", ""), String.class }); + } + // boolean布尔类型,等于true或者false + else if (StringUtils.equals(str, "true") || StringUtils.equalsIgnoreCase(str, "false")) + { + classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); + } + // long长整形,包含L + else if (StringUtils.containsIgnoreCase(str, "L")) + { + classs.add(new Object[] { Long.valueOf(StringUtils.replaceIgnoreCase(str, "L", "")), Long.class }); + } + // double浮点类型,包含D + else if (StringUtils.containsIgnoreCase(str, "D")) + { + classs.add(new Object[] { Double.valueOf(StringUtils.replaceIgnoreCase(str, "D", "")), Double.class }); + } + // 其他类型归类为整形 + else + { + classs.add(new Object[] { Integer.valueOf(str), Integer.class }); + } + } + return classs; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List methodParams) + { + Class[] classs = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Class) os[1]; + index++; + } + return classs; + } + + /** + * 获取参数值 + * + * @param methodParams 参数相关列表 + * @return 参数值列表 + */ + public static Object[] getMethodParamsValue(List methodParams) + { + Object[] classs = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Object) os[0]; + index++; + } + return classs; + } } diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java index 4475f2b7..b7c2f536 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java @@ -4,15 +4,12 @@ import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.Job; import org.quartz.JobBuilder; -import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.ruoyi.common.constant.ScheduleConstants; import com.ruoyi.common.exception.job.TaskException; import com.ruoyi.common.exception.job.TaskException.Code; @@ -26,8 +23,6 @@ import com.ruoyi.quartz.domain.SysJob; */ public class ScheduleUtils { - private static final Logger log = LoggerFactory.getLogger(ScheduleUtils.class); - /** * 得到quartz任务类 * @@ -41,35 +36,19 @@ public class ScheduleUtils } /** - * 获取触发器key + * 构建任务触发对象 */ - public static TriggerKey getTriggerKey(Long jobId) + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) { - return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId); + return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); } /** - * 获取jobKey + * 构建任务键对象 */ - public static JobKey getJobKey(Long jobId) + public static JobKey getJobKey(Long jobId, String jobGroup) { - return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId); - } - - /** - * 获取表达式触发器 - */ - public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) - { - try - { - return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId)); - } - catch (SchedulerException e) - { - log.error("getCronTrigger 异常:", e); - } - return null; + return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); } /** @@ -79,24 +58,26 @@ public class ScheduleUtils { Class jobClass = getQuartzJobClass(job); // 构建job信息 - JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(job.getJobId())).build(); + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); // 表达式调度构建器 CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); // 按新的cronExpression表达式构建一个新的trigger - CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(job.getJobId())) + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) .withSchedule(cronScheduleBuilder).build(); // 放入参数,运行时的方法可以获取 jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); // 判断是否存在 - if (scheduler.checkExists(getJobKey(job.getJobId()))) + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) { // 防止创建时存在数据问题 先移除,然后在执行创建操作 - scheduler.deleteJob(getJobKey(job.getJobId())); + scheduler.deleteJob(getJobKey(jobId, jobGroup)); } scheduler.scheduleJob(jobDetail, trigger); @@ -104,54 +85,13 @@ public class ScheduleUtils // 暂停任务 if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) { - pauseJob(scheduler, job.getJobId()); + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); } } /** - * 更新定时任务 - */ - public static void updateScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException - { - createScheduleJob(scheduler, job); - } - - /** - * 立即执行任务 - */ - public static void run(Scheduler scheduler, SysJob job) throws SchedulerException - { - // 参数 - JobDataMap dataMap = new JobDataMap(); - dataMap.put(ScheduleConstants.TASK_PROPERTIES, job); - - scheduler.triggerJob(getJobKey(job.getJobId()), dataMap); - } - - /** - * 暂停任务 - */ - public static void pauseJob(Scheduler scheduler, Long jobId) throws SchedulerException - { - scheduler.pauseJob(getJobKey(jobId)); - } - - /** - * 恢复任务 + * 设置定时任务策略 */ - public static void resumeJob(Scheduler scheduler, Long jobId) throws SchedulerException - { - scheduler.resumeJob(getJobKey(jobId)); - } - - /** - * 删除定时任务 - */ - public static void deleteScheduleJob(Scheduler scheduler, Long jobId) throws SchedulerException - { - scheduler.deleteJob(getJobKey(jobId)); - } - public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) throws TaskException { @@ -170,4 +110,4 @@ public class ScheduleUtils + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); } } -} +} \ No newline at end of file diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml index 4c4706a7..ac35e628 100644 --- a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml @@ -8,8 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - + @@ -17,7 +16,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select job_log_id, job_name, job_group, method_name, method_params, job_message, status, exception_info, create_time + select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time from sys_job_log @@ -30,8 +29,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND status = #{status} - - AND method_name like concat('%', #{methodName}, '%') + + AND invoke_target like concat('%', #{invokeTarget}, '%') and date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d') @@ -71,8 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" job_log_id, job_name, job_group, - method_name, - method_params, + invoke_target, job_message, status, exception_info, @@ -81,8 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{jobLogId}, #{jobName}, #{jobGroup}, - #{methodName}, - #{methodParams}, + #{invokeTarget}, #{jobMessage}, #{status}, #{exceptionInfo}, diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml index 0e4a6a74..69233bdf 100644 --- a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml +++ b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml @@ -8,8 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - + @@ -22,7 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select job_id, job_name, job_group, method_name, method_params, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark + select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark from sys_job @@ -32,11 +31,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND job_name like concat('%', #{jobName}, '%') + + AND job_group = #{jobGroup} + AND status = #{status} - - AND method_name like concat('%', #{methodName}, '%') + + AND invoke_target like concat('%', #{invokeTarget}, '%') @@ -66,8 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" job_name = #{jobName}, job_group = #{jobGroup}, - method_name = #{methodName}, - method_params = #{methodParams}, + invoke_target = #{invokeTarget}, cron_expression = #{cronExpression}, misfire_policy = #{misfirePolicy}, concurrent = #{concurrent}, @@ -84,8 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" job_id, job_name, job_group, - method_name, - method_params, + invoke_target, cron_expression, misfire_policy, concurrent, @@ -97,8 +97,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{jobId}, #{jobName}, #{jobGroup}, - #{methodName}, - #{methodParams}, + #{invokeTarget}, #{cronExpression}, #{misfirePolicy}, #{concurrent}, diff --git a/ruoyi-quartz/src/main/resources/templates/monitor/job/add.html b/ruoyi-quartz/src/main/resources/templates/monitor/job/add.html index d404a975..ceeca489 100644 --- a/ruoyi-quartz/src/main/resources/templates/monitor/job/add.html +++ b/ruoyi-quartz/src/main/resources/templates/monitor/job/add.html @@ -14,21 +14,20 @@
- +
- +
- +
- -
-
-
- -
- + + Bean调用示例:ryTask.ryParams('ry') + Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry') + 参数说明:支持字符串,布尔类型,长整型,浮点型,整形
diff --git a/ruoyi-quartz/src/main/resources/templates/monitor/job/detail.html b/ruoyi-quartz/src/main/resources/templates/monitor/job/detail.html index d7c927fa..e360eeca 100644 --- a/ruoyi-quartz/src/main/resources/templates/monitor/job/detail.html +++ b/ruoyi-quartz/src/main/resources/templates/monitor/job/detail.html @@ -18,13 +18,13 @@
- +
- -
+ +
@@ -56,13 +56,13 @@
- +
- -
+ +
diff --git a/ruoyi-quartz/src/main/resources/templates/monitor/job/edit.html b/ruoyi-quartz/src/main/resources/templates/monitor/job/edit.html index 67911460..d46227f9 100644 --- a/ruoyi-quartz/src/main/resources/templates/monitor/job/edit.html +++ b/ruoyi-quartz/src/main/resources/templates/monitor/job/edit.html @@ -15,21 +15,20 @@
- +
- +
- +
- -
-
-
- -
- + + Bean调用示例:ryTask.ryParams('ry') + Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry') + 参数说明:支持字符串,布尔类型,长整型,浮点型,整形
@@ -77,15 +76,6 @@ $("#form-job-edit").validate({ onkeyup: false, rules:{ - jobName:{ - required:true, - }, - jobGroup:{ - required:true, - }, - methodName:{ - required:true, - }, cronExpression:{ required:true, remote: { diff --git a/ruoyi-quartz/src/main/resources/templates/monitor/job/job.html b/ruoyi-quartz/src/main/resources/templates/monitor/job/job.html index 45135f4f..62b8625d 100644 --- a/ruoyi-quartz/src/main/resources/templates/monitor/job/job.html +++ b/ruoyi-quartz/src/main/resources/templates/monitor/job/job.html @@ -14,7 +14,10 @@ 任务名称:
  • - 方法名称: + 任务分组:
  • 任务状态: