定时任务支持Class类调用&多类型参数

master
RuoYi 5 years ago committed by Limy
parent 451d6fe861
commit a73d5bd9d7

@ -196,7 +196,7 @@
var pageNumber = table.pageNumber; var pageNumber = table.pageNumber;
return pageSize * (pageNumber - 1) + index + 1; return pageSize * (pageNumber - 1) + index + 1;
}, },
// 列超出指定长度浮动提示(单击文本复制 // 列超出指定长度浮动提示(单击文本复制
tooltip: function (value, length) { tooltip: function (value, length) {
var _length = $.common.isEmpty(length) ? 20 : length; var _length = $.common.isEmpty(length) ? 20 : length;
var _text = ""; var _text = "";
@ -386,7 +386,7 @@
var actions = []; var actions = [];
$.each(datas, function(index, dict) { $.each(datas, function(index, dict) {
if (dict.dictValue == ('' + value)) { 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("<span class='%s'>%s</span>", listClass, dict.dictLabel)); actions.push($.common.sprintf("<span class='%s'>%s</span>", listClass, dict.dictLabel));
return false; return false;
} }

@ -71,11 +71,9 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label">用户性别:</label> <label class="col-sm-4 control-label">用户性别:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group"> <select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}">
<select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}"> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option> </select>
</select>
</div>
</div> </div>
</div> </div>
</div> </div>

@ -85,11 +85,9 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label">用户性别:</label> <label class="col-sm-4 control-label">用户性别:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group"> <select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}">
<select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}"> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{sex}"></option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{sex}"></option> </select>
</select>
</div>
</div> </div>
</div> </div>
</div> </div>

@ -127,7 +127,7 @@ public class SysJobController extends BaseController
@ResponseBody @ResponseBody
public AjaxResult addSave(SysJob job) throws SchedulerException, TaskException 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 @ResponseBody
public AjaxResult editSave(SysJob job) throws SchedulerException, TaskException public AjaxResult editSave(SysJob job) throws SchedulerException, TaskException
{ {
return toAjax(jobService.updateJobCron(job)); return toAjax(jobService.updateJob(job));
} }
/** /**

@ -31,24 +31,20 @@ public class SysJob extends BaseEntity implements Serializable
@Excel(name = "任务组名") @Excel(name = "任务组名")
private String jobGroup; private String jobGroup;
/** 任务方法 */ /** 调用目标字符串 */
@Excel(name = "任务方法") @Excel(name = "调用目标字符串")
private String methodName; private String invokeTarget;
/** 方法参数 */
@Excel(name = "方法参数")
private String methodParams;
/** cron执行表达式 */ /** cron执行表达式 */
@Excel(name = "执行表达式 ") @Excel(name = "执行表达式 ")
private String cronExpression; private String cronExpression;
/** cron计划策略 */ /** cron计划策略 */
@Excel(name = "计划策略 ") @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行")
private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT;
/** 是否并发执行0允许 1禁止 */ /** 是否并发执行0允许 1禁止 */
@Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止")
private String concurrent; private String concurrent;
/** 任务状态0正常 1暂停 */ /** 任务状态0正常 1暂停 */
@ -85,24 +81,14 @@ public class SysJob extends BaseEntity implements Serializable
this.jobGroup = jobGroup; this.jobGroup = jobGroup;
} }
public String getMethodName() public String getInvokeTarget()
{
return methodName;
}
public void setMethodName(String methodName)
{ {
this.methodName = methodName; return invokeTarget;
} }
public String getMethodParams() public void setInvokeTarget(String invokeTarget)
{ {
return methodParams; this.invokeTarget = invokeTarget;
}
public void setMethodParams(String methodParams)
{
this.methodParams = methodParams;
} }
public String getCronExpression() public String getCronExpression()
@ -153,15 +139,13 @@ public class SysJob extends BaseEntity implements Serializable
{ {
this.status = status; this.status = status;
} }
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("jobId", getJobId()) .append("jobId", getJobId())
.append("jobName", getJobName()) .append("jobName", getJobName())
.append("jobGroup", getJobGroup()) .append("jobGroup", getJobGroup())
.append("methodName", getMethodName())
.append("methodParams", getMethodParams())
.append("cronExpression", getCronExpression()) .append("cronExpression", getCronExpression())
.append("nextValidTime", getNextValidTime()) .append("nextValidTime", getNextValidTime())
.append("misfirePolicy", getMisfirePolicy()) .append("misfirePolicy", getMisfirePolicy())

@ -27,13 +27,9 @@ public class SysJobLog extends BaseEntity
@Excel(name = "任务组名") @Excel(name = "任务组名")
private String jobGroup; private String jobGroup;
/** 任务方法 */ /** 调用目标字符串 */
@Excel(name = "任务方法") @Excel(name = "调用目标字符串")
private String methodName; private String invokeTarget;
/** 方法参数 */
@Excel(name = "方法参数")
private String methodParams;
/** 日志信息 */ /** 日志信息 */
@Excel(name = "日志信息") @Excel(name = "日志信息")
@ -83,24 +79,14 @@ public class SysJobLog extends BaseEntity
this.jobGroup = jobGroup; this.jobGroup = jobGroup;
} }
public String getMethodName() public String getInvokeTarget()
{
return methodName;
}
public void setMethodName(String methodName)
{ {
this.methodName = methodName; return invokeTarget;
} }
public String getMethodParams() public void setInvokeTarget(String invokeTarget)
{ {
return methodParams; this.invokeTarget = invokeTarget;
}
public void setMethodParams(String methodParams)
{
this.methodParams = methodParams;
} }
public String getJobMessage() public String getJobMessage()
@ -132,7 +118,7 @@ public class SysJobLog extends BaseEntity
{ {
this.exceptionInfo = exceptionInfo; this.exceptionInfo = exceptionInfo;
} }
public Date getStartTime() public Date getStartTime()
{ {
return startTime; return startTime;
@ -159,8 +145,6 @@ public class SysJobLog extends BaseEntity
.append("jobLogId", getJobLogId()) .append("jobLogId", getJobLogId())
.append("jobName", getJobName()) .append("jobName", getJobName())
.append("jobGroup", getJobGroup()) .append("jobGroup", getJobGroup())
.append("methodName", getMethodName())
.append("methodParams", getMethodParams())
.append("jobMessage", getJobMessage()) .append("jobMessage", getJobMessage())
.append("status", getStatus()) .append("status", getStatus())
.append("exceptionInfo", getExceptionInfo()) .append("exceptionInfo", getExceptionInfo())

@ -77,20 +77,20 @@ public interface ISysJobService
public void run(SysJob job) throws SchedulerException; public void run(SysJob job) throws SchedulerException;
/** /**
* *
* *
* @param job * @param job
* @return * @return
*/ */
public int insertJobCron(SysJob job) throws SchedulerException, TaskException; public int insertJob(SysJob job) throws SchedulerException, TaskException;
/** /**
* *
* *
* @param job * @param job
* @return * @return
*/ */
public int updateJobCron(SysJob job) throws SchedulerException, TaskException; public int updateJob(SysJob job) throws SchedulerException, TaskException;
/** /**
* cron * cron
@ -99,4 +99,4 @@ public interface ISysJobService
* @return * @return
*/ */
public boolean checkCronExpressionIsValid(String cronExpression); public boolean checkCronExpressionIsValid(String cronExpression);
} }

@ -2,6 +2,8 @@ package com.ruoyi.quartz.service.impl;
import java.util.List; import java.util.List;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import org.quartz.JobDataMap;
import org.quartz.JobKey;
import org.quartz.Scheduler; import org.quartz.Scheduler;
import org.quartz.SchedulerException; import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -31,7 +33,8 @@ public class SysJobServiceImpl implements ISysJobService
private SysJobMapper jobMapper; private SysJobMapper jobMapper;
/** /**
* *
* ID
*/ */
@PostConstruct @PostConstruct
public void init() throws SchedulerException, TaskException public void init() throws SchedulerException, TaskException
@ -39,7 +42,7 @@ public class SysJobServiceImpl implements ISysJobService
List<SysJob> jobList = jobMapper.selectJobAll(); List<SysJob> jobList = jobMapper.selectJobAll();
for (SysJob job : jobList) for (SysJob job : jobList)
{ {
ScheduleUtils.updateScheduleJob(scheduler, job); updateSchedulerJob(job, job.getJobGroup());
} }
} }
@ -76,11 +79,13 @@ public class SysJobServiceImpl implements ISysJobService
@Transactional @Transactional
public int pauseJob(SysJob job) throws SchedulerException public int pauseJob(SysJob job) throws SchedulerException
{ {
Long jobId = job.getJobId();
String jobGroup = job.getJobGroup();
job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
int rows = jobMapper.updateJob(job); int rows = jobMapper.updateJob(job);
if (rows > 0) if (rows > 0)
{ {
ScheduleUtils.pauseJob(scheduler, job.getJobId()); scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
} }
return rows; return rows;
} }
@ -94,11 +99,13 @@ public class SysJobServiceImpl implements ISysJobService
@Transactional @Transactional
public int resumeJob(SysJob job) throws SchedulerException public int resumeJob(SysJob job) throws SchedulerException
{ {
Long jobId = job.getJobId();
String jobGroup = job.getJobGroup();
job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); job.setStatus(ScheduleConstants.Status.NORMAL.getValue());
int rows = jobMapper.updateJob(job); int rows = jobMapper.updateJob(job);
if (rows > 0) if (rows > 0)
{ {
ScheduleUtils.resumeJob(scheduler, job.getJobId()); scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup));
} }
return rows; return rows;
} }
@ -112,10 +119,12 @@ public class SysJobServiceImpl implements ISysJobService
@Transactional @Transactional
public int deleteJob(SysJob job) throws SchedulerException 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) if (rows > 0)
{ {
ScheduleUtils.deleteScheduleJob(scheduler, job.getJobId()); scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
} }
return rows; return rows;
} }
@ -169,7 +178,13 @@ public class SysJobServiceImpl implements ISysJobService
@Transactional @Transactional
public void run(SysJob job) throws SchedulerException 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 @Override
@Transactional @Transactional
public int insertJobCron(SysJob job) throws SchedulerException, TaskException public int insertJob(SysJob job) throws SchedulerException, TaskException
{ {
job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
int rows = jobMapper.insertJob(job); int rows = jobMapper.insertJob(job);
@ -197,16 +212,36 @@ public class SysJobServiceImpl implements ISysJobService
*/ */
@Override @Override
@Transactional @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); int rows = jobMapper.updateJob(job);
if (rows > 0) if (rows > 0)
{ {
ScheduleUtils.updateScheduleJob(scheduler, job); updateSchedulerJob(job, properties.getJobGroup());
} }
return rows; 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 * cron
* *
@ -218,4 +253,4 @@ public class SysJobServiceImpl implements ISysJobService
{ {
return CronUtils.isValid(cronExpression); return CronUtils.isValid(cronExpression);
} }
} }

@ -1,6 +1,7 @@
package com.ruoyi.quartz.task; package com.ruoyi.quartz.task;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.ruoyi.common.utils.StringUtils;
/** /**
* *
@ -10,6 +11,11 @@ import org.springframework.stereotype.Component;
@Component("ryTask") @Component("ryTask")
public class 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) public void ryParams(String params)
{ {
System.out.println("执行有参方法:" + params); System.out.println("执行有参方法:" + params);

@ -76,8 +76,7 @@ public abstract class AbstractQuartzJob implements Job
final SysJobLog sysJobLog = new SysJobLog(); final SysJobLog sysJobLog = new SysJobLog();
sysJobLog.setJobName(sysJob.getJobName()); sysJobLog.setJobName(sysJob.getJobName());
sysJobLog.setJobGroup(sysJob.getJobGroup()); sysJobLog.setJobGroup(sysJob.getJobGroup());
sysJobLog.setMethodName(sysJob.getMethodName()); sysJobLog.setInvokeTarget(sysJob.getInvokeTarget());
sysJobLog.setMethodParams(sysJob.getMethodParams());
sysJobLog.setStartTime(startTime); sysJobLog.setStartTime(startTime);
sysJobLog.setEndTime(new Date()); sysJobLog.setEndTime(new Date());
long runMs = sysJobLog.getEndTime().getTime() - sysJobLog.getStartTime().getTime(); long runMs = sysJobLog.getEndTime().getTime() - sysJobLog.getStartTime().getTime();

@ -2,6 +2,8 @@ package com.ruoyi.quartz.util;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.quartz.domain.SysJob; import com.ruoyi.quartz.domain.SysJob;
@ -20,11 +22,21 @@ public class JobInvokeUtil
*/ */
public static void invokeMethod(SysJob sysJob) throws Exception public static void invokeMethod(SysJob sysJob) throws Exception
{ {
Object bean = SpringUtils.getBean(sysJob.getJobName()); String invokeTarget = sysJob.getInvokeTarget();
String methodName = sysJob.getMethodName(); String beanName = getBeanName(invokeTarget);
String methodParams = sysJob.getMethodParams(); String methodName = getMethodName(invokeTarget);
List<Object[]> 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 methodName
* @param methodParams * @param methodParams
*/ */
private static void invokeSpringBean(Object bean, String methodName, String methodParams) private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
InvocationTargetException InvocationTargetException
{ {
if (StringUtils.isNotEmpty(methodParams)) if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0)
{ {
Method method = bean.getClass().getDeclaredMethod(methodName, String.class); Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams));
method.invoke(bean, methodParams); method.invoke(bean, getMethodParamsValue(methodParams));
} }
else else
{ {
@ -49,4 +61,122 @@ public class JobInvokeUtil
method.invoke(bean); 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<Object[]> getMethodParams(String invokeTarget)
{
String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
if (StringUtils.isEmpty(methodStr))
{
return null;
}
String[] methodParams = methodStr.split(",");
List<Object[]> 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<Object[]> 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<Object[]> methodParams)
{
Object[] classs = new Object[methodParams.size()];
int index = 0;
for (Object[] os : methodParams)
{
classs[index] = (Object) os[0];
index++;
}
return classs;
}
} }

@ -4,15 +4,12 @@ import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger; import org.quartz.CronTrigger;
import org.quartz.Job; import org.quartz.Job;
import org.quartz.JobBuilder; import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail; import org.quartz.JobDetail;
import org.quartz.JobKey; import org.quartz.JobKey;
import org.quartz.Scheduler; import org.quartz.Scheduler;
import org.quartz.SchedulerException; import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder; import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey; import org.quartz.TriggerKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ruoyi.common.constant.ScheduleConstants; import com.ruoyi.common.constant.ScheduleConstants;
import com.ruoyi.common.exception.job.TaskException; import com.ruoyi.common.exception.job.TaskException;
import com.ruoyi.common.exception.job.TaskException.Code; import com.ruoyi.common.exception.job.TaskException.Code;
@ -26,8 +23,6 @@ import com.ruoyi.quartz.domain.SysJob;
*/ */
public class ScheduleUtils public class ScheduleUtils
{ {
private static final Logger log = LoggerFactory.getLogger(ScheduleUtils.class);
/** /**
* quartz * 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); return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup);
}
/**
*
*/
public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId)
{
try
{
return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
}
catch (SchedulerException e)
{
log.error("getCronTrigger 异常:", e);
}
return null;
} }
/** /**
@ -79,24 +58,26 @@ public class ScheduleUtils
{ {
Class<? extends Job> jobClass = getQuartzJobClass(job); Class<? extends Job> jobClass = getQuartzJobClass(job);
// 构建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 cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder);
// 按新的cronExpression表达式构建一个新的trigger // 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(job.getJobId())) CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup))
.withSchedule(cronScheduleBuilder).build(); .withSchedule(cronScheduleBuilder).build();
// 放入参数,运行时的方法可以获取 // 放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); 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); scheduler.scheduleJob(jobDetail, trigger);
@ -104,54 +85,13 @@ public class ScheduleUtils
// 暂停任务 // 暂停任务
if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) 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) public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb)
throws TaskException throws TaskException
{ {
@ -170,4 +110,4 @@ public class ScheduleUtils
+ "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR);
} }
} }
} }

@ -8,8 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<id property="jobLogId" column="job_log_id" /> <id property="jobLogId" column="job_log_id" />
<result property="jobName" column="job_name" /> <result property="jobName" column="job_name" />
<result property="jobGroup" column="job_group" /> <result property="jobGroup" column="job_group" />
<result property="methodName" column="method_name" /> <result property="invokeTarget" column="invoke_target" />
<result property="methodParams" column="method_params" />
<result property="jobMessage" column="job_message" /> <result property="jobMessage" column="job_message" />
<result property="status" column="status" /> <result property="status" column="status" />
<result property="exceptionInfo" column="exception_info" /> <result property="exceptionInfo" column="exception_info" />
@ -17,7 +16,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectJobLogVo"> <sql id="selectJobLogVo">
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 from sys_job_log
</sql> </sql>
@ -30,8 +29,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status != null and status != ''"> <if test="status != null and status != ''">
AND status = #{status} AND status = #{status}
</if> </if>
<if test="methodName != null and methodName != ''"> <if test="invokeTarget != null and invokeTarget != ''">
AND method_name like concat('%', #{methodName}, '%') AND invoke_target like concat('%', #{invokeTarget}, '%')
</if> </if>
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 --> <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
and date_format(create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d') and date_format(create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
@ -71,8 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobLogId != null and jobLogId != 0">job_log_id,</if> <if test="jobLogId != null and jobLogId != 0">job_log_id,</if>
<if test="jobName != null and jobName != ''">job_name,</if> <if test="jobName != null and jobName != ''">job_name,</if>
<if test="jobGroup != null and jobGroup != ''">job_group,</if> <if test="jobGroup != null and jobGroup != ''">job_group,</if>
<if test="methodName != null and methodName != ''">method_name,</if> <if test="invokeTarget != null and invokeTarget != ''">invoke_target,</if>
<if test="methodParams != null and methodParams != ''">method_params,</if>
<if test="jobMessage != null and jobMessage != ''">job_message,</if> <if test="jobMessage != null and jobMessage != ''">job_message,</if>
<if test="status != null and status != ''">status,</if> <if test="status != null and status != ''">status,</if>
<if test="exceptionInfo != null and exceptionInfo != ''">exception_info,</if> <if test="exceptionInfo != null and exceptionInfo != ''">exception_info,</if>
@ -81,8 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobLogId != null and jobLogId != 0">#{jobLogId},</if> <if test="jobLogId != null and jobLogId != 0">#{jobLogId},</if>
<if test="jobName != null and jobName != ''">#{jobName},</if> <if test="jobName != null and jobName != ''">#{jobName},</if>
<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if> <if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
<if test="methodName != null and methodName != ''">#{methodName},</if> <if test="invokeTarget != null and invokeTarget != ''">#{invokeTarget},</if>
<if test="methodParams != null and methodParams != ''">#{methodParams},</if>
<if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if> <if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if>
<if test="status != null and status != ''">#{status},</if> <if test="status != null and status != ''">#{status},</if>
<if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if> <if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if>

@ -8,8 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<id property="jobId" column="job_id" /> <id property="jobId" column="job_id" />
<result property="jobName" column="job_name" /> <result property="jobName" column="job_name" />
<result property="jobGroup" column="job_group" /> <result property="jobGroup" column="job_group" />
<result property="methodName" column="method_name" /> <result property="invokeTarget" column="invoke_target" />
<result property="methodParams" column="method_params" />
<result property="cronExpression" column="cron_expression" /> <result property="cronExpression" column="cron_expression" />
<result property="misfirePolicy" column="misfire_policy" /> <result property="misfirePolicy" column="misfire_policy" />
<result property="concurrent" column="concurrent" /> <result property="concurrent" column="concurrent" />
@ -22,7 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectJobVo"> <sql id="selectJobVo">
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 from sys_job
</sql> </sql>
@ -32,11 +31,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobName != null and jobName != ''"> <if test="jobName != null and jobName != ''">
AND job_name like concat('%', #{jobName}, '%') AND job_name like concat('%', #{jobName}, '%')
</if> </if>
<if test="jobGroup != null and jobGroup != ''">
AND job_group = #{jobGroup}
</if>
<if test="status != null and status != ''"> <if test="status != null and status != ''">
AND status = #{status} AND status = #{status}
</if> </if>
<if test="methodName != null and methodName != ''"> <if test="invokeTarget != null and invokeTarget != ''">
AND method_name like concat('%', #{methodName}, '%') AND invoke_target like concat('%', #{invokeTarget}, '%')
</if> </if>
</where> </where>
</select> </select>
@ -66,8 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<set> <set>
<if test="jobName != null and jobName != ''">job_name = #{jobName},</if> <if test="jobName != null and jobName != ''">job_name = #{jobName},</if>
<if test="jobGroup != null and jobGroup != ''">job_group = #{jobGroup},</if> <if test="jobGroup != null and jobGroup != ''">job_group = #{jobGroup},</if>
<if test="methodName != null and methodName != ''">method_name = #{methodName},</if> <if test="invokeTarget != null and invokeTarget != ''">invoke_target = #{invokeTarget},</if>
<if test="methodParams != null">method_params = #{methodParams},</if>
<if test="cronExpression != null and cronExpression != ''">cron_expression = #{cronExpression},</if> <if test="cronExpression != null and cronExpression != ''">cron_expression = #{cronExpression},</if>
<if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy = #{misfirePolicy},</if> <if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy = #{misfirePolicy},</if>
<if test="concurrent != null and concurrent != ''">concurrent = #{concurrent},</if> <if test="concurrent != null and concurrent != ''">concurrent = #{concurrent},</if>
@ -84,8 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobId != null and jobId != 0">job_id,</if> <if test="jobId != null and jobId != 0">job_id,</if>
<if test="jobName != null and jobName != ''">job_name,</if> <if test="jobName != null and jobName != ''">job_name,</if>
<if test="jobGroup != null and jobGroup != ''">job_group,</if> <if test="jobGroup != null and jobGroup != ''">job_group,</if>
<if test="methodName != null and methodName != ''">method_name,</if> <if test="invokeTarget != null and invokeTarget != ''">invoke_target,</if>
<if test="methodParams != null and methodParams != ''">method_params,</if>
<if test="cronExpression != null and cronExpression != ''">cron_expression,</if> <if test="cronExpression != null and cronExpression != ''">cron_expression,</if>
<if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy,</if> <if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy,</if>
<if test="concurrent != null and concurrent != ''">concurrent,</if> <if test="concurrent != null and concurrent != ''">concurrent,</if>
@ -97,8 +97,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobId != null and jobId != 0">#{jobId},</if> <if test="jobId != null and jobId != 0">#{jobId},</if>
<if test="jobName != null and jobName != ''">#{jobName},</if> <if test="jobName != null and jobName != ''">#{jobName},</if>
<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if> <if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
<if test="methodName != null and methodName != ''">#{methodName},</if> <if test="invokeTarget != null and invokeTarget != ''">#{invokeTarget},</if>
<if test="methodParams != null and methodParams != ''">#{methodParams},</if>
<if test="cronExpression != null and cronExpression != ''">#{cronExpression},</if> <if test="cronExpression != null and cronExpression != ''">#{cronExpression},</if>
<if test="misfirePolicy != null and misfirePolicy != ''">#{misfirePolicy},</if> <if test="misfirePolicy != null and misfirePolicy != ''">#{misfirePolicy},</if>
<if test="concurrent != null and concurrent != ''">#{concurrent},</if> <if test="concurrent != null and concurrent != ''">#{concurrent},</if>

@ -14,21 +14,20 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务组</label> <label class="col-sm-3 control-label">任务组:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" type="text" name="jobGroup" id="jobGroup" required> <select name="jobGroup" class="form-control m-b" th:with="type=${@dict.getType('sys_job_group')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label ">方法名称</label> <label class="col-sm-3 control-label ">调用目标字符串</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" type="text" name="methodName" id="methodName" required> <input class="form-control" type="text" name="invokeTarget" id="invokeTarget" required>
</div> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Bean调用示例ryTask.ryParams('ry')</span>
</div> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Class类调用示例com.ruoyi.quartz.task.RyTask.ryParams('ry')</span>
<div class="form-group"> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 参数说明:支持字符串,布尔类型,长整型,浮点型,整形</span>
<label class="col-sm-3 control-label ">方法参数:</label>
<div class="col-sm-8">
<input class="form-control" type="text" name="methodParams" id="methodParams">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">

@ -18,13 +18,13 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务组</label> <label class="col-sm-3 control-label">任务组:</label>
<div class="form-control-static" th:text="${jobLog.jobGroup}"> <div class="form-control-static" th:text="${jobLog.jobGroup}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务方法</label> <label class="col-sm-3 control-label">调用目标字符串</label>
<div class="form-control-static" th:text="${jobLog.methodName} + '(' + ${#strings.defaultString(jobLog.methodParams,'')} + ')'"> <div class="form-control-static" th:text="${jobLog.invokeTarget}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -56,13 +56,13 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务组</label> <label class="col-sm-3 control-label">任务组:</label>
<div class="form-control-static" th:text="${job.jobGroup}"> <div class="form-control-static" th:text="${job.jobGroup}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务方法</label> <label class="col-sm-3 control-label">调用目标字符串</label>
<div class="form-control-static" th:text="${job.methodName} + '(' + ${#strings.defaultString(job.methodParams,'')} + ')'"> <div class="form-control-static" th:text="${job.invokeTarget}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">

@ -15,21 +15,20 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务组</label> <label class="col-sm-3 control-label">任务组:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" type="text" name="jobGroup" id="jobGroup" th:field="*{jobGroup}" required> <select name="jobGroup" class="form-control m-b" th:with="type=${@dict.getType('sys_job_group')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{jobGroup}"></option>
</select>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label ">方法名称</label> <label class="col-sm-3 control-label ">调用目标字符串</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" type="text" name="methodName" id="methodName" th:field="*{methodName}" required> <input class="form-control" type="text" name="invokeTarget" id="invokeTarget" th:field="*{invokeTarget}" required>
</div> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Bean调用示例ryTask.ryParams('ry')</span>
</div> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Class类调用示例com.ruoyi.quartz.task.RyTask.ryParams('ry')</span>
<div class="form-group"> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 参数说明:支持字符串,布尔类型,长整型,浮点型,整形</span>
<label class="col-sm-3 control-label ">方法参数:</label>
<div class="col-sm-8">
<input class="form-control" type="text" name="methodParams" id="methodParams" th:field="*{methodParams}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -77,15 +76,6 @@
$("#form-job-edit").validate({ $("#form-job-edit").validate({
onkeyup: false, onkeyup: false,
rules:{ rules:{
jobName:{
required:true,
},
jobGroup:{
required:true,
},
methodName:{
required:true,
},
cronExpression:{ cronExpression:{
required:true, required:true,
remote: { remote: {

@ -14,7 +14,10 @@
任务名称:<input type="text" name="jobName"/> 任务名称:<input type="text" name="jobName"/>
</li> </li>
<li> <li>
方法名称:<input type="text" name="methodName"/> 任务分组:<select name="jobGroup" th:with="type=${@dict.getType('sys_job_group')}">
<option value="">所有</option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</li> </li>
<li> <li>
任务状态:<select name="status" th:with="type=${@dict.getType('sys_job_status')}"> 任务状态:<select name="status" th:with="type=${@dict.getType('sys_job_status')}">
@ -60,7 +63,7 @@
var editFlag = [[${@permission.hasPermi('monitor:job:edit')}]]; var editFlag = [[${@permission.hasPermi('monitor:job:edit')}]];
var removeFlag = [[${@permission.hasPermi('monitor:job:remove')}]]; var removeFlag = [[${@permission.hasPermi('monitor:job:remove')}]];
var statusFlag = [[${@permission.hasPermi('monitor:job:changeStatus')}]]; var statusFlag = [[${@permission.hasPermi('monitor:job:changeStatus')}]];
var datas = [[${@dict.getType('sys_job_status')}]]; var datas = [[${@dict.getType('sys_job_group')}]];
var prefix = ctx + "monitor/job"; var prefix = ctx + "monitor/job";
$(function() { $(function() {
@ -84,20 +87,20 @@
{ {
field: 'jobName', field: 'jobName',
title: '任务名称', title: '任务名称',
sortable: true
}, },
{ {
field: 'jobGroup', field: 'jobGroup',
title: '任务组名', title: '任务分组',
sortable: true formatter: function(value, row, index) {
}, return $.table.selectDictLabel(datas, value);
{ }
field: 'methodName',
title: '方法名称'
}, },
{ {
field: 'methodParams', field: 'invokeTarget',
title: '方法参数' title: '调用目标字符串',
formatter: function(value, row, index) {
return $.table.tooltip(value);
}
}, },
{ {
field: 'cronExpression', field: 'cronExpression',
@ -121,7 +124,7 @@
align: 'center', align: 'center',
formatter: function(value, row, index) { formatter: function(value, row, index) {
var actions = []; var actions = [];
actions.push('<a class="btn btn-primary btn-xs ' + statusFlag + '" href="javascript:void(0)" onclick="run(\'' + row.jobId + '\')"><i class="fa fa-play-circle-o"></i> 执行一次</a> '); actions.push('<a class="btn btn-primary btn-xs ' + statusFlag + '" href="javascript:void(0)" onclick="run(\'' + row.jobId + '\', \'' + row.jobGroup + '\')"><i class="fa fa-play-circle-o"></i> 执行一次</a> ');
actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.jobId + '\')"><i class="fa fa-search"></i>详细</a> '); actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.jobId + '\')"><i class="fa fa-search"></i>详细</a> ');
return actions.join(''); return actions.join('');
} }
@ -133,30 +136,30 @@
/* 调度任务状态显示 */ /* 调度任务状态显示 */
function statusTools(row) { function statusTools(row) {
if (row.status == 1) { if (row.status == 1) {
return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="start(\'' + row.jobId + '\')"></i> '; return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="start(\'' + row.jobId + '\', \'' + row.jobGroup + '\')"></i> ';
} else { } else {
return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="stop(\'' + row.jobId + '\')"></i> '; return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="stop(\'' + row.jobId + '\', \'' + row.jobGroup + '\')"></i> ';
} }
} }
/* 立即执行一次 */ /* 立即执行一次 */
function run(jobId) { function run(jobId, jobGroup) {
$.modal.confirm("确认要立即执行一次任务吗?", function() { $.modal.confirm("确认要立即执行一次任务吗?", function() {
$.operate.post(prefix + "/run", { "jobId": jobId}); $.operate.post(prefix + "/run", { "jobId": jobId, "jobId": jobId, "jobGroup": jobGroup});
}) })
} }
/* 调度任务-停用 */ /* 调度任务-停用 */
function stop(jobId) { function stop(jobId, jobGroup) {
$.modal.confirm("确认要停用任务吗?", function() { $.modal.confirm("确认要停用任务吗?", function() {
$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "status": 1 }); $.operate.post(prefix + "/changeStatus", { "jobId": jobId, "jobGroup": jobGroup, "status": 1 });
}) })
} }
/* 调度任务-启用 */ /* 调度任务-启用 */
function start(jobId) { function start(jobId, jobGroup) {
$.modal.confirm("确认要启用任务吗?", function() { $.modal.confirm("确认要启用任务吗?", function() {
$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "status": 0 }); $.operate.post(prefix + "/changeStatus", { "jobId": jobId, "jobGroup": jobGroup, "status": 0 });
}) })
} }

@ -58,7 +58,8 @@
<th:block th:include="include :: footer" /> <th:block th:include="include :: footer" />
<script th:inline="javascript"> <script th:inline="javascript">
var detailFlag = [[${@permission.hasPermi('monitor:job:detail')}]]; var detailFlag = [[${@permission.hasPermi('monitor:job:detail')}]];
var datas = [[${@dict.getType('sys_common_status')}]]; var statusDatas = [[${@dict.getType('sys_common_status')}]];
var groupDatas = [[${@dict.getType('sys_job_group')}]];
var prefix = ctx + "monitor/jobLog"; var prefix = ctx + "monitor/jobLog";
$(function() { $(function() {
@ -80,21 +81,21 @@
}, },
{ {
field: 'jobName', field: 'jobName',
title: '任务名称', title: '任务名称'
sortable: true
}, },
{ {
field: 'jobGroup', field: 'jobGroup',
title: '任务组名', title: '任务分组',
sortable: true formatter: function(value, row, index) {
}, return $.table.selectDictLabel(groupDatas, value);
{ }
field: 'methodName',
title: '方法名称'
}, },
{ {
field: 'methodParams', field: 'invokeTarget',
title: '方法参数' title: '调用目标字符串',
formatter: function(value, row, index) {
return $.table.tooltip(value);
}
}, },
{ {
field: 'jobMessage', field: 'jobMessage',
@ -105,7 +106,7 @@
title: '状态', title: '状态',
align: 'center', align: 'center',
formatter: function(value, row, index) { formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value); return $.table.selectDictLabel(statusDatas, value);
} }
}, },
{ {

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save