定时任务支持Class类调用&多类型参数
parent
e7a0f97315
commit
d21284f325
|
@ -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;
|
return invokeTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMethodName(String methodName)
|
public void setInvokeTarget(String invokeTarget)
|
||||||
{
|
{
|
||||||
this.methodName = methodName;
|
this.invokeTarget = invokeTarget;
|
||||||
}
|
|
||||||
|
|
||||||
public String getMethodParams()
|
|
||||||
{
|
|
||||||
return methodParams;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
return invokeTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMethodName(String methodName)
|
public void setInvokeTarget(String invokeTarget)
|
||||||
{
|
{
|
||||||
this.methodName = methodName;
|
this.invokeTarget = invokeTarget;
|
||||||
}
|
|
||||||
|
|
||||||
public String getMethodParams()
|
|
||||||
{
|
|
||||||
return methodParams;
|
|
||||||
}
|
|
||||||
|
|
||||||
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') >= date_format(#{params.beginTime},'%y%m%d')
|
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"
|
||||||
<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',
|
field: 'invokeTarget',
|
||||||
title: '方法名称'
|
title: '调用目标字符串',
|
||||||
},
|
formatter: function(value, row, index) {
|
||||||
{
|
return $.table.tooltip(value);
|
||||||
field: 'methodParams',
|
}
|
||||||
title: '方法参数'
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
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',
|
field: 'invokeTarget',
|
||||||
title: '方法名称'
|
title: '调用目标字符串',
|
||||||
},
|
formatter: function(value, row, index) {
|
||||||
{
|
return $.table.tooltip(value);
|
||||||
field: 'methodParams',
|
}
|
||||||
title: '方法参数'
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
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…
Reference in New Issue