底层关键数据调整:JobKey的group和name属性,改为采用执行器主键ID和任务主键ID
This commit is contained in:
parent
f3573c8643
commit
d66bdc8811
|
@ -738,6 +738,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|||
- 4、规范系统配置数据,通过配置文件统一管理;
|
||||
- 5、执行器支持手动设置执行地址列表,提供开关切换使用注册地址还是手动设置的地址;
|
||||
- 6、执行器路由规则:第一个、循环、随机、顺序故障(默认)转移;
|
||||
- 7、底层扩展数据接口调整;
|
||||
- 8、新建任务默认为非运行状态;
|
||||
|
||||
#### TODO LIST
|
||||
- 1、支持脚本JOB(源码或指定路径), 即shell/python/php等, 日志实时输出并支持在线监控;定制JobHandler实现;
|
||||
|
|
|
@ -147,8 +147,7 @@ CREATE TABLE XXL_JOB_QRTZ_LOCKS
|
|||
|
||||
CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_INFO` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`job_group` int(11) NOT NULL COMMENT '任务组(执行器ID)',
|
||||
`job_name` varchar(255) NOT NULL COMMENT '任务名',
|
||||
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
|
||||
`job_cron` varchar(128) NOT NULL COMMENT '任务执行CRON',
|
||||
`job_desc` varchar(255) NOT NULL,
|
||||
`add_time` datetime DEFAULT NULL,
|
||||
|
@ -167,8 +166,8 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_INFO` (
|
|||
|
||||
CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOG` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`job_group` int(11) NOT NULL COMMENT '任务组',
|
||||
`job_name` varchar(255) NOT NULL COMMENT '任务名',
|
||||
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
|
||||
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
|
||||
`executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
|
||||
`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
|
||||
`executor_param` varchar(255) DEFAULT NULL COMMENT 'executor_param',
|
||||
|
@ -181,10 +180,9 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOG` (
|
|||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE XXL_JOB_QRTZ_TRIGGER_LOGGLUE (
|
||||
CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOGGLUE` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`job_group` int(11) NOT NULL,
|
||||
`job_name` varchar(255) NOT NULL,
|
||||
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
|
||||
`glue_source` text,
|
||||
`glue_remark` varchar(128) NOT NULL,
|
||||
`add_time` timestamp NULL DEFAULT NULL,
|
||||
|
|
|
@ -63,7 +63,7 @@ public class JobCodeController {
|
|||
xxlJobInfoDao.update(exists_jobInfo);
|
||||
|
||||
// remove code backup more than 30
|
||||
xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 3);
|
||||
xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30);
|
||||
|
||||
return ReturnT.SUCCESS;
|
||||
}
|
||||
|
|
|
@ -64,26 +64,26 @@ public class JobInfoController {
|
|||
|
||||
@RequestMapping("/remove")
|
||||
@ResponseBody
|
||||
public ReturnT<String> remove(int jobGroup, String jobName) {
|
||||
return xxlJobService.remove(jobGroup, jobName);
|
||||
public ReturnT<String> remove(int id) {
|
||||
return xxlJobService.remove(id);
|
||||
}
|
||||
|
||||
@RequestMapping("/pause")
|
||||
@ResponseBody
|
||||
public ReturnT<String> pause(int jobGroup, String jobName) {
|
||||
return xxlJobService.pause(jobGroup, jobName);
|
||||
public ReturnT<String> pause(int id) {
|
||||
return xxlJobService.pause(id);
|
||||
}
|
||||
|
||||
@RequestMapping("/resume")
|
||||
@ResponseBody
|
||||
public ReturnT<String> resume(int jobGroup, String jobName) {
|
||||
return xxlJobService.resume(jobGroup, jobName);
|
||||
public ReturnT<String> resume(int id) {
|
||||
return xxlJobService.resume(id);
|
||||
}
|
||||
|
||||
@RequestMapping("/trigger")
|
||||
@ResponseBody
|
||||
public ReturnT<String> triggerJob(int jobGroup, String jobName) {
|
||||
return xxlJobService.triggerJob(jobGroup, jobName);
|
||||
public ReturnT<String> triggerJob(int id) {
|
||||
return xxlJobService.triggerJob(id);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -40,29 +40,33 @@ public class JobLogController {
|
|||
public IXxlJobLogDao xxlJobLogDao;
|
||||
|
||||
@RequestMapping
|
||||
public String index(Model model, String jobGroup, String jobName) {
|
||||
public String index(Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {
|
||||
|
||||
// 任务组
|
||||
// 执行器列表
|
||||
List<XxlJobGroup> jobGroupList = xxlJobGroupDao.findAll();
|
||||
|
||||
model.addAttribute("jobGroup", jobGroup);
|
||||
model.addAttribute("jobName", jobName);
|
||||
model.addAttribute("JobGroupList", jobGroupList);
|
||||
|
||||
// 任务
|
||||
if (jobId > 0) {
|
||||
XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
|
||||
model.addAttribute("jobInfo", jobInfo);
|
||||
}
|
||||
|
||||
return "joblog/joblog.index";
|
||||
}
|
||||
|
||||
@RequestMapping("/getJobsByGroup")
|
||||
@ResponseBody
|
||||
public ReturnT<List<XxlJobLog>> listJobByGroup(String jobGroup){
|
||||
List<XxlJobLog> list = xxlJobInfoDao.getJobsByGroup(jobGroup);
|
||||
return new ReturnT<List<XxlJobLog>>(list);
|
||||
public ReturnT<List<XxlJobInfo>> listJobByGroup(String jobGroup){
|
||||
List<XxlJobInfo> list = xxlJobInfoDao.getJobsByGroup(jobGroup);
|
||||
return new ReturnT<List<XxlJobInfo>>(list);
|
||||
}
|
||||
|
||||
@RequestMapping("/pageList")
|
||||
@ResponseBody
|
||||
public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int start,
|
||||
@RequestParam(required = false, defaultValue = "10") int length,
|
||||
int jobGroup, String jobName, String filterTime) {
|
||||
int jobGroup, int jobId, String filterTime) {
|
||||
|
||||
// parse param
|
||||
Date triggerTimeStart = null;
|
||||
|
@ -78,8 +82,8 @@ public class JobLogController {
|
|||
}
|
||||
|
||||
// page query
|
||||
List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobGroup, jobName, triggerTimeStart, triggerTimeEnd);
|
||||
int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobName, triggerTimeStart, triggerTimeEnd);
|
||||
List<XxlJobLog> list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd);
|
||||
int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd);
|
||||
|
||||
// package result
|
||||
Map<String, Object> maps = new HashMap<String, Object>();
|
||||
|
@ -130,8 +134,8 @@ public class JobLogController {
|
|||
public ReturnT<String> logKill(int id){
|
||||
// base check
|
||||
XxlJobLog log = xxlJobLogDao.load(id);
|
||||
XxlJobInfo jobInfo = xxlJobInfoDao.load(log.getJobGroup(), log.getJobName());
|
||||
if (log == null || jobInfo==null) {
|
||||
XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());
|
||||
if (jobInfo==null) {
|
||||
return new ReturnT<String>(500, "参数异常");
|
||||
}
|
||||
if (ReturnT.SUCCESS_CODE != log.getTriggerCode()) {
|
||||
|
@ -146,7 +150,7 @@ public class JobLogController {
|
|||
e.printStackTrace();
|
||||
return new ReturnT<String>(500, e.getMessage());
|
||||
}
|
||||
ReturnT<String> runResult = executorBiz.kill(String.valueOf(log.getJobGroup()), log.getJobName());
|
||||
ReturnT<String> runResult = executorBiz.kill(jobInfo.getId());
|
||||
|
||||
if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
|
||||
log.setHandleCode(ReturnT.FAIL_CODE);
|
||||
|
|
|
@ -32,17 +32,17 @@ public class AdminBizImpl implements AdminBiz {
|
|||
// trigger success, to trigger child job, and avoid repeat trigger child job
|
||||
String childTriggerMsg = null;
|
||||
if (ReturnT.SUCCESS_CODE==handleCallbackParam.getCode() && ReturnT.SUCCESS_CODE!=log.getHandleCode()) {
|
||||
XxlJobInfo xxlJobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.load(log.getJobGroup(), log.getJobName());
|
||||
XxlJobInfo xxlJobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(log.getJobId());
|
||||
if (xxlJobInfo!=null && StringUtils.isNotBlank(xxlJobInfo.getChildJobKey())) {
|
||||
childTriggerMsg = "<hr>";
|
||||
String[] childJobKeys = xxlJobInfo.getChildJobKey().split(",");
|
||||
for (int i = 0; i < childJobKeys.length; i++) {
|
||||
String[] jobKeyArr = childJobKeys[i].split("_");
|
||||
if (jobKeyArr!=null && jobKeyArr.length==2) {
|
||||
XxlJobInfo childJobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.load(Integer.valueOf(jobKeyArr[0]), jobKeyArr[1]);
|
||||
XxlJobInfo childJobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(Integer.valueOf(jobKeyArr[1]));
|
||||
if (childJobInfo!=null) {
|
||||
try {
|
||||
boolean ret = XxlJobDynamicScheduler.triggerJob(childJobInfo.getJobName(), String.valueOf(childJobInfo.getJobGroup()));
|
||||
boolean ret = XxlJobDynamicScheduler.triggerJob(String.valueOf(childJobInfo.getId()), String.valueOf(childJobInfo.getJobGroup()));
|
||||
|
||||
// add msg
|
||||
childTriggerMsg += MessageFormat.format("<br> {0}/{1} 触发子任务成功, 子任务Key: {2}, status: {3}, 子任务描述: {4}",
|
||||
|
|
|
@ -35,12 +35,13 @@ public class RemoteHttpJobBean extends QuartzJobBean {
|
|||
protected void executeInternal(JobExecutionContext context)
|
||||
throws JobExecutionException {
|
||||
JobKey jobKey = context.getTrigger().getJobKey();
|
||||
|
||||
XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.load(Integer.valueOf(jobKey.getGroup()), jobKey.getName());
|
||||
Integer jobId = Integer.valueOf(jobKey.getName());
|
||||
XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId);
|
||||
|
||||
// save log
|
||||
XxlJobLog jobLog = new XxlJobLog();
|
||||
jobLog.setJobGroup(jobInfo.getJobGroup());
|
||||
jobLog.setJobName(jobInfo.getJobName());
|
||||
jobLog.setJobId(jobInfo.getId());
|
||||
XxlJobDynamicScheduler.xxlJobLogDao.save(jobLog);
|
||||
logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId());
|
||||
|
||||
|
@ -57,14 +58,13 @@ public class RemoteHttpJobBean extends QuartzJobBean {
|
|||
|
||||
// trigger request
|
||||
TriggerParam triggerParam = new TriggerParam();
|
||||
triggerParam.setJobGroup(String.valueOf(jobInfo.getJobGroup()));
|
||||
triggerParam.setJobName(jobInfo.getJobName());
|
||||
triggerParam.setJobId(jobInfo.getId());
|
||||
triggerParam.setExecutorHandler(jobInfo.getExecutorHandler());
|
||||
triggerParam.setExecutorParams(jobInfo.getExecutorParam());
|
||||
triggerParam.setGlueSwitch((jobInfo.getGlueSwitch()==0)?false:true);
|
||||
triggerParam.setLogAddress(adminAddressSet);
|
||||
triggerParam.setLogId(jobLog.getId());
|
||||
triggerParam.setLogDateTim(jobLog.getTriggerTime().getTime());
|
||||
triggerParam.setLogAddress(adminAddressSet);
|
||||
|
||||
// parse address
|
||||
String groupAddressInfo = "注册方式:";
|
||||
|
|
|
@ -8,10 +8,9 @@ import java.util.Date;
|
|||
*/
|
||||
public class XxlJobInfo {
|
||||
|
||||
private int id;
|
||||
private int id; // 主键ID (JobKey.name)
|
||||
|
||||
private int jobGroup; // 任务组 (执行器ID)
|
||||
private String jobName; // 任务名
|
||||
private int jobGroup; // 执行器主键ID (JobKey.group)
|
||||
private String jobCron; // 任务执行CRON表达式 【base on quartz】
|
||||
private String jobDesc;
|
||||
|
||||
|
@ -50,14 +49,6 @@ public class XxlJobInfo {
|
|||
this.jobGroup = jobGroup;
|
||||
}
|
||||
|
||||
public String getJobName() {
|
||||
return jobName;
|
||||
}
|
||||
|
||||
public void setJobName(String jobName) {
|
||||
this.jobName = jobName;
|
||||
}
|
||||
|
||||
public String getJobCron() {
|
||||
return jobCron;
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ public class XxlJobLog {
|
|||
|
||||
// job info
|
||||
private int jobGroup;
|
||||
private String jobName;
|
||||
private int jobId;
|
||||
|
||||
// execute info
|
||||
private String executorAddress;
|
||||
|
@ -45,12 +45,12 @@ public class XxlJobLog {
|
|||
this.jobGroup = jobGroup;
|
||||
}
|
||||
|
||||
public String getJobName() {
|
||||
return jobName;
|
||||
public int getJobId() {
|
||||
return jobId;
|
||||
}
|
||||
|
||||
public void setJobName(String jobName) {
|
||||
this.jobName = jobName;
|
||||
public void setJobId(int jobId) {
|
||||
this.jobId = jobId;
|
||||
}
|
||||
|
||||
public String getExecutorAddress() {
|
||||
|
|
|
@ -7,7 +7,7 @@ package com.xxl.job.admin.core.model;
|
|||
public class XxlJobLogGlue {
|
||||
|
||||
private int id;
|
||||
private int jobId;
|
||||
private int jobId; // 任务主键ID
|
||||
private String glueSource;
|
||||
private String glueRemark;
|
||||
private String addTime;
|
||||
|
|
|
@ -143,7 +143,9 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
|
|||
// fill job info
|
||||
public static void fillJobInfo(XxlJobInfo jobInfo) {
|
||||
// TriggerKey : name + group
|
||||
TriggerKey triggerKey = TriggerKey.triggerKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
|
||||
String group = String.valueOf(jobInfo.getJobGroup());
|
||||
String name = String.valueOf(jobInfo.getId());
|
||||
TriggerKey triggerKey = TriggerKey.triggerKey(name, group);
|
||||
|
||||
try {
|
||||
Trigger trigger = scheduler.getTrigger(triggerKey);
|
||||
|
@ -177,7 +179,7 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
|
|||
|
||||
// addJob 新增
|
||||
@SuppressWarnings("unchecked")
|
||||
public static boolean addJob(String jobGroup, String jobName, String cronExpression) throws SchedulerException {
|
||||
public static boolean addJob(String jobName, String jobGroup, String cronExpression) throws SchedulerException {
|
||||
// TriggerKey : name + group
|
||||
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
|
||||
JobKey jobKey = new JobKey(jobName, jobGroup);
|
||||
|
|
|
@ -57,7 +57,7 @@ public class JobMonitorHelper {
|
|||
// pass
|
||||
}
|
||||
if (ReturnT.FAIL_CODE == log.getTriggerCode()|| ReturnT.FAIL_CODE==log.getHandleCode()) {
|
||||
XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.load(log.getJobGroup(), log.getJobName());
|
||||
XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(log.getJobId());
|
||||
if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {
|
||||
|
||||
Set<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package com.xxl.job.admin.dao;
|
||||
|
||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||
import com.xxl.job.admin.core.model.XxlJobLog;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
@ -18,11 +17,10 @@ public interface IXxlJobInfoDao {
|
|||
public int save(XxlJobInfo info);
|
||||
|
||||
public XxlJobInfo loadById(int id);
|
||||
public XxlJobInfo load(int jobGroup, String jobName);
|
||||
|
||||
public int update(XxlJobInfo item);
|
||||
|
||||
public int delete(int jobGroup, String jobName);
|
||||
public int delete(int id);
|
||||
|
||||
public List<XxlJobLog> getJobsByGroup(String jobGroup);
|
||||
public List<XxlJobInfo> getJobsByGroup(String jobGroup);
|
||||
}
|
||||
|
|
|
@ -11,8 +11,8 @@ import java.util.List;
|
|||
*/
|
||||
public interface IXxlJobLogDao {
|
||||
|
||||
public List<XxlJobLog> pageList(int offset, int pagesize, int jobGroup, String jobName, Date triggerTimeStart, Date triggerTimeEnd);
|
||||
public int pageListCount(int offset, int pagesize, int jobGroup, String jobName, Date triggerTimeStart, Date triggerTimeEnd);
|
||||
public List<XxlJobLog> pageList(int offset, int pagesize, int jobGroup, int jobId, Date triggerTimeStart, Date triggerTimeEnd);
|
||||
public int pageListCount(int offset, int pagesize, int jobGroup, int jobId, Date triggerTimeStart, Date triggerTimeEnd);
|
||||
|
||||
public XxlJobLog load(int id);
|
||||
|
||||
|
@ -20,6 +20,6 @@ public interface IXxlJobLogDao {
|
|||
public int updateTriggerInfo(XxlJobLog xxlJobLog);
|
||||
public int updateHandleInfo(XxlJobLog xxlJobLog);
|
||||
|
||||
public int delete(int jobGroup, String jobName);
|
||||
public int delete(int jobId);
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package com.xxl.job.admin.dao.impl;
|
||||
|
||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||
import com.xxl.job.admin.core.model.XxlJobLog;
|
||||
import com.xxl.job.admin.dao.IXxlJobInfoDao;
|
||||
import org.mybatis.spring.SqlSessionTemplate;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
@ -52,31 +51,18 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao {
|
|||
return sqlSessionTemplate.selectOne("XxlJobInfoMapper.loadById", id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public XxlJobInfo load(int jobGroup, String jobName) {
|
||||
HashMap<String, Object> params = new HashMap<String, Object>();
|
||||
params.put("jobGroup", jobGroup);
|
||||
params.put("jobName", jobName);
|
||||
|
||||
return sqlSessionTemplate.selectOne("XxlJobInfoMapper.load", params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int update(XxlJobInfo item) {
|
||||
return sqlSessionTemplate.update("XxlJobInfoMapper.update", item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int delete(int jobGroup, String jobName) {
|
||||
HashMap<String, Object> params = new HashMap<String, Object>();
|
||||
params.put("jobGroup", jobGroup);
|
||||
params.put("jobName", jobName);
|
||||
|
||||
return sqlSessionTemplate.update("XxlJobInfoMapper.delete", params);
|
||||
public int delete(int id) {
|
||||
return sqlSessionTemplate.update("XxlJobInfoMapper.delete", id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<XxlJobLog> getJobsByGroup(String jobGroup) {
|
||||
public List<XxlJobInfo> getJobsByGroup(String jobGroup) {
|
||||
return sqlSessionTemplate.selectList("XxlJobInfoMapper.getJobsByGroup", jobGroup);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,12 +21,12 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
|
|||
public SqlSessionTemplate sqlSessionTemplate;
|
||||
|
||||
@Override
|
||||
public List<XxlJobLog> pageList(int offset, int pagesize, int jobGroup, String jobName, Date triggerTimeStart, Date triggerTimeEnd) {
|
||||
public List<XxlJobLog> pageList(int offset, int pagesize, int jobGroup, int jobId, Date triggerTimeStart, Date triggerTimeEnd) {
|
||||
HashMap<String, Object> params = new HashMap<String, Object>();
|
||||
params.put("offset", offset);
|
||||
params.put("pagesize", pagesize);
|
||||
params.put("jobGroup", jobGroup);
|
||||
params.put("jobName", jobName);
|
||||
params.put("jobId", jobId);
|
||||
params.put("triggerTimeStart", triggerTimeStart);
|
||||
params.put("triggerTimeEnd", triggerTimeEnd);
|
||||
|
||||
|
@ -34,12 +34,12 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
|
|||
}
|
||||
|
||||
@Override
|
||||
public int pageListCount(int offset, int pagesize, int jobGroup, String jobName, Date triggerTimeStart, Date triggerTimeEnd) {
|
||||
public int pageListCount(int offset, int pagesize, int jobGroup, int jobId, Date triggerTimeStart, Date triggerTimeEnd) {
|
||||
HashMap<String, Object> params = new HashMap<String, Object>();
|
||||
params.put("offset", offset);
|
||||
params.put("pagesize", pagesize);
|
||||
params.put("jobGroup", jobGroup);
|
||||
params.put("jobName", jobName);
|
||||
params.put("jobId", jobId);
|
||||
params.put("triggerTimeStart", triggerTimeStart);
|
||||
params.put("triggerTimeEnd", triggerTimeEnd);
|
||||
|
||||
|
@ -73,11 +73,8 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
|
|||
}
|
||||
|
||||
@Override
|
||||
public int delete(int jobGroup, String jobName) {
|
||||
HashMap<String, Object> params = new HashMap<String, Object>();
|
||||
params.put("jobGroup", jobGroup);
|
||||
params.put("jobName", jobName);
|
||||
return sqlSessionTemplate.delete("XxlJobLogMapper.delete", params);
|
||||
public int delete(int jobId) {
|
||||
return sqlSessionTemplate.delete("XxlJobLogMapper.delete", jobId);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -19,12 +19,12 @@ public interface IXxlJobService {
|
|||
|
||||
public ReturnT<String> reschedule(XxlJobInfo jobInfo);
|
||||
|
||||
public ReturnT<String> remove(int jobGroup, String jobName);
|
||||
public ReturnT<String> remove(int id);
|
||||
|
||||
public ReturnT<String> pause(int jobGroup, String jobName);
|
||||
public ReturnT<String> pause(int id);
|
||||
|
||||
public ReturnT<String> resume(int jobGroup, String jobName);
|
||||
public ReturnT<String> resume(int id);
|
||||
|
||||
public ReturnT<String> triggerJob(int jobGroup, String jobName);
|
||||
public ReturnT<String> triggerJob(int id);
|
||||
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@ import com.xxl.job.admin.dao.IXxlJobLogGlueDao;
|
|||
import com.xxl.job.admin.service.IXxlJobService;
|
||||
import com.xxl.job.core.biz.model.ReturnT;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.lang.time.FastDateFormat;
|
||||
import org.quartz.CronExpression;
|
||||
import org.quartz.SchedulerException;
|
||||
import org.slf4j.Logger;
|
||||
|
@ -20,7 +19,6 @@ import org.springframework.stereotype.Service;
|
|||
|
||||
import javax.annotation.Resource;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -98,53 +96,20 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
|||
if (childJobKeyArr.length!=2) {
|
||||
return new ReturnT<String>(500, MessageFormat.format("子任务Key({0})格式错误", childJobKeyItem));
|
||||
}
|
||||
XxlJobInfo childJobInfo = xxlJobInfoDao.load(Integer.valueOf(childJobKeyArr[0]), childJobKeyArr[1]);
|
||||
XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(childJobKeyArr[1]));
|
||||
if (childJobInfo==null) {
|
||||
return new ReturnT<String>(500, MessageFormat.format("子任务Key({0})无效", childJobKeyItem));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// generate jobName
|
||||
String jobName = FastDateFormat.getInstance("yyyyMMddHHmmssSSSS").format(new Date());
|
||||
jobInfo.setJobName(jobName);
|
||||
try {
|
||||
if (XxlJobDynamicScheduler.checkExists(jobName, String.valueOf(jobInfo.getJobGroup()))) {
|
||||
return new ReturnT<String>(500, "系统繁忙,请稍后重试");
|
||||
}
|
||||
} catch (SchedulerException e1) {
|
||||
e1.printStackTrace();
|
||||
return new ReturnT<String>(500, "系统繁忙,请稍后重试");
|
||||
// add in db
|
||||
xxlJobInfoDao.save(jobInfo);
|
||||
int jobId = jobInfo.getId();
|
||||
if (jobId < 1) {
|
||||
return new ReturnT<String>(500, "新增任务失败");
|
||||
}
|
||||
|
||||
// Backup to the database
|
||||
/*XxlJobInfo jobInfo = new XxlJobInfo();
|
||||
jobInfo.setJobGroup(jobGroup);
|
||||
jobInfo.setJobName(jobName);
|
||||
jobInfo.setJobCron(jobCron);
|
||||
jobInfo.setJobDesc(jobDesc);
|
||||
jobInfo.setAuthor(author);
|
||||
jobInfo.setAlarmEmail(alarmEmail);
|
||||
jobInfo.setExecutorHandler(executorHandler);
|
||||
jobInfo.setExecutorParam(executorParam);
|
||||
jobInfo.setGlueSwitch(glueSwitch);
|
||||
jobInfo.setGlueSource(glueSource);
|
||||
jobInfo.setGlueRemark(glueRemark);
|
||||
jobInfo.setChildJobKey(childJobKey);*/
|
||||
|
||||
try {
|
||||
// add job 2 quartz
|
||||
boolean result = XxlJobDynamicScheduler.addJob(String.valueOf(jobInfo.getJobGroup()), jobName, jobInfo.getJobCron());
|
||||
if (result) {
|
||||
xxlJobInfoDao.save(jobInfo);
|
||||
return ReturnT.SUCCESS;
|
||||
} else {
|
||||
return new ReturnT<String>(500, "新增任务失败");
|
||||
}
|
||||
} catch (SchedulerException e) {
|
||||
logger.error("", e);
|
||||
}
|
||||
return ReturnT.FAIL;
|
||||
return ReturnT.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -178,7 +143,7 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
|||
if (childJobKeyArr.length!=2) {
|
||||
return new ReturnT<String>(500, MessageFormat.format("子任务Key({0})格式错误", childJobKeyItem));
|
||||
}
|
||||
XxlJobInfo childJobInfo = xxlJobInfoDao.load(Integer.valueOf(childJobKeyArr[0]), childJobKeyArr[1]);
|
||||
XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(childJobKeyArr[1]));
|
||||
if (childJobInfo==null) {
|
||||
return new ReturnT<String>(500, MessageFormat.format("子任务Key({0})无效", childJobKeyItem));
|
||||
}
|
||||
|
@ -203,7 +168,7 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
|||
|
||||
try {
|
||||
// fresh quartz
|
||||
boolean ret = XxlJobDynamicScheduler.rescheduleJob(String.valueOf(exists_jobInfo.getJobGroup()), exists_jobInfo.getJobName(), exists_jobInfo.getJobCron());
|
||||
boolean ret = XxlJobDynamicScheduler.rescheduleJob(String.valueOf(exists_jobInfo.getJobGroup()), String.valueOf(exists_jobInfo.getId()), exists_jobInfo.getJobCron());
|
||||
if (ret) {
|
||||
xxlJobInfoDao.update(exists_jobInfo);
|
||||
return ReturnT.SUCCESS;
|
||||
|
@ -217,14 +182,16 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
|||
}
|
||||
|
||||
@Override
|
||||
public ReturnT<String> remove(int jobGroup, String jobName) {
|
||||
XxlJobInfo xxlJobInfo = xxlJobInfoDao.load(jobGroup, jobName);
|
||||
public ReturnT<String> remove(int id) {
|
||||
XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
|
||||
String group = String.valueOf(xxlJobInfo.getJobGroup());
|
||||
String name = String.valueOf(xxlJobInfo.getId());
|
||||
|
||||
try {
|
||||
XxlJobDynamicScheduler.removeJob(jobName, String.valueOf(jobGroup));
|
||||
xxlJobInfoDao.delete(jobGroup, jobName);
|
||||
xxlJobLogDao.delete(jobGroup, jobName);
|
||||
xxlJobLogGlueDao.deleteByJobId(xxlJobInfo.getId());
|
||||
XxlJobDynamicScheduler.removeJob(name, group);
|
||||
xxlJobInfoDao.delete(id);
|
||||
xxlJobLogDao.delete(id);
|
||||
xxlJobLogGlueDao.deleteByJobId(id);
|
||||
return ReturnT.SUCCESS;
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -233,9 +200,13 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
|||
}
|
||||
|
||||
@Override
|
||||
public ReturnT<String> pause(int jobGroup, String jobName) {
|
||||
public ReturnT<String> pause(int id) {
|
||||
XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
|
||||
String group = String.valueOf(xxlJobInfo.getJobGroup());
|
||||
String name = String.valueOf(xxlJobInfo.getId());
|
||||
|
||||
try {
|
||||
XxlJobDynamicScheduler.pauseJob(jobName, String.valueOf(jobGroup)); // jobStatus do not store
|
||||
XxlJobDynamicScheduler.pauseJob(name, group); // jobStatus do not store
|
||||
return ReturnT.SUCCESS;
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
|
@ -244,10 +215,19 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
|||
}
|
||||
|
||||
@Override
|
||||
public ReturnT<String> resume(int jobGroup, String jobName) {
|
||||
public ReturnT<String> resume(int id) {
|
||||
XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
|
||||
String group = String.valueOf(xxlJobInfo.getJobGroup());
|
||||
String name = String.valueOf(xxlJobInfo.getId());
|
||||
|
||||
try {
|
||||
XxlJobDynamicScheduler.resumeJob(jobName, String.valueOf(jobGroup));
|
||||
return ReturnT.SUCCESS;
|
||||
boolean ret = false;
|
||||
if (XxlJobDynamicScheduler.checkExists(name, group)) {
|
||||
ret = XxlJobDynamicScheduler.resumeJob(name, group);
|
||||
} else {
|
||||
ret = XxlJobDynamicScheduler.addJob(name, group, xxlJobInfo.getJobCron());
|
||||
}
|
||||
return ret?ReturnT.SUCCESS:ReturnT.FAIL;
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
return ReturnT.FAIL;
|
||||
|
@ -255,9 +235,13 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
|||
}
|
||||
|
||||
@Override
|
||||
public ReturnT<String> triggerJob(int jobGroup, String jobName) {
|
||||
public ReturnT<String> triggerJob(int id) {
|
||||
XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
|
||||
String group = String.valueOf(xxlJobInfo.getJobGroup());
|
||||
String name = String.valueOf(xxlJobInfo.getId());
|
||||
|
||||
try {
|
||||
XxlJobDynamicScheduler.triggerJob(jobName, String.valueOf(jobGroup));
|
||||
XxlJobDynamicScheduler.triggerJob(name, group);
|
||||
return ReturnT.SUCCESS;
|
||||
} catch (SchedulerException e) {
|
||||
e.printStackTrace();
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
<result column="id" property="id" />
|
||||
|
||||
<result column="job_group" property="jobGroup" />
|
||||
<result column="job_name" property="jobName" />
|
||||
<result column="job_cron" property="jobCron" />
|
||||
<result column="job_desc" property="jobDesc" />
|
||||
|
||||
|
@ -31,7 +30,6 @@
|
|||
<sql id="Base_Column_List">
|
||||
t.id,
|
||||
t.job_group,
|
||||
t.job_name,
|
||||
t.job_cron,
|
||||
t.job_desc,
|
||||
t.add_time,
|
||||
|
@ -74,11 +72,10 @@
|
|||
</if>
|
||||
</trim>
|
||||
</select>
|
||||
|
||||
|
||||
<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" useGeneratedKeys="true" keyProperty="id" >
|
||||
INSERT INTO XXL_JOB_QRTZ_TRIGGER_INFO (
|
||||
job_group,
|
||||
job_name,
|
||||
job_cron,
|
||||
job_desc,
|
||||
add_time,
|
||||
|
@ -93,8 +90,7 @@
|
|||
glue_remark,
|
||||
child_jobkey
|
||||
) VALUES (
|
||||
#{jobGroup},
|
||||
#{jobName},
|
||||
#{jobGroup},
|
||||
#{jobCron},
|
||||
#{jobDesc},
|
||||
NOW(),
|
||||
|
@ -109,9 +105,10 @@
|
|||
#{glueRemark},
|
||||
#{childJobKey}
|
||||
);
|
||||
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
|
||||
SELECT LAST_INSERT_ID()
|
||||
</selectKey>
|
||||
<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
|
||||
SELECT LAST_INSERT_ID()
|
||||
/*SELECT @@IDENTITY AS id*/
|
||||
</selectKey>-->
|
||||
</insert>
|
||||
|
||||
<select id="loadById" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
|
||||
|
@ -119,13 +116,6 @@
|
|||
FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
|
||||
WHERE t.id = #{id}
|
||||
</select>
|
||||
|
||||
<select id="load" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
|
||||
SELECT <include refid="Base_Column_List" />
|
||||
FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
|
||||
WHERE t.job_group = #{jobGroup}
|
||||
AND t.job_name = #{jobName}
|
||||
</select>
|
||||
|
||||
<update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" >
|
||||
UPDATE XXL_JOB_QRTZ_TRIGGER_INFO
|
||||
|
@ -142,17 +132,13 @@
|
|||
glue_source = #{glueSource},
|
||||
glue_remark = #{glueRemark},
|
||||
child_jobkey = #{childJobKey}
|
||||
WHERE job_group = #{jobGroup}
|
||||
AND job_name = #{jobName}
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
<delete id="delete" parameterType="java.util.HashMap">
|
||||
DELETE
|
||||
FROM
|
||||
XXL_JOB_QRTZ_TRIGGER_INFO
|
||||
WHERE
|
||||
job_group = #{jobGroup}
|
||||
AND job_name = #{jobName}
|
||||
FROM XXL_JOB_QRTZ_TRIGGER_INFO
|
||||
WHERE id = #{id}
|
||||
</delete>
|
||||
|
||||
<select id="getJobsByGroup" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
|
||||
|
|
|
@ -5,10 +5,10 @@
|
|||
|
||||
<resultMap id="XxlJobLog" type="com.xxl.job.admin.core.model.XxlJobLog" >
|
||||
<result column="id" property="id" />
|
||||
|
||||
<result column="job_group" property="jobGroup" />
|
||||
<result column="job_name" property="jobName" />
|
||||
|
||||
|
||||
<result column="job_group" property="jobGroup" />
|
||||
<result column="job_id" property="jobId" />
|
||||
|
||||
<result column="executor_address" property="executorAddress" />
|
||||
<result column="executor_handler" property="executorHandler" />
|
||||
<result column="executor_param" property="executorParam" />
|
||||
|
@ -26,7 +26,7 @@
|
|||
<sql id="Base_Column_List">
|
||||
t.id,
|
||||
t.job_group,
|
||||
t.job_name,
|
||||
t.job_id,
|
||||
t.executor_address,
|
||||
t.executor_handler,
|
||||
t.executor_param,
|
||||
|
@ -45,8 +45,8 @@
|
|||
<if test="jobGroup != null and jobGroup != ''">
|
||||
AND t.job_group = #{jobGroup}
|
||||
</if>
|
||||
<if test="jobName != null and jobName != ''">
|
||||
AND t.job_name = #{jobName}
|
||||
<if test="jobId gt 0">
|
||||
AND t.job_id = #{jobId}
|
||||
</if>
|
||||
<if test="triggerTimeStart != null">
|
||||
AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
|
||||
|
@ -66,8 +66,8 @@
|
|||
<if test="jobGroup != null and jobGroup != ''">
|
||||
AND t.job_group = #{jobGroup}
|
||||
</if>
|
||||
<if test="jobName != null and jobName != ''">
|
||||
AND t.job_name = #{jobName}
|
||||
<if test="jobId gt 0">
|
||||
AND t.job_id = #{jobId}
|
||||
</if>
|
||||
<if test="triggerTimeStart != null">
|
||||
AND t.trigger_time <![CDATA[ >= ]]> #{triggerTimeStart}
|
||||
|
@ -88,13 +88,13 @@
|
|||
<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" >
|
||||
INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOG (
|
||||
`job_group`,
|
||||
`job_name`,
|
||||
`job_id`,
|
||||
`executor_address`,
|
||||
`executor_handler`,
|
||||
`executor_param`
|
||||
) VALUES (
|
||||
#{jobGroup},
|
||||
#{jobName},
|
||||
#{jobGroup},
|
||||
#{jobId},
|
||||
#{executorAddress},
|
||||
#{executorHandler},
|
||||
#{executorParam}
|
||||
|
@ -127,8 +127,7 @@
|
|||
|
||||
<delete id="delete">
|
||||
delete from XXL_JOB_QRTZ_TRIGGER_LOG
|
||||
WHERE job_group = #{jobGroup}
|
||||
AND job_name = #{jobName}
|
||||
WHERE job_id = #{jobId}
|
||||
</delete>
|
||||
|
||||
</mapper>
|
|
@ -51,7 +51,7 @@
|
|||
<div class="col-xs-4">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon">JobHandler</span>
|
||||
<input type="text" class="form-control" id="executorHandler" value="${jobName}" autocomplete="on" >
|
||||
<input type="text" class="form-control" id="executorHandler" autocomplete="on" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-2">
|
||||
|
@ -74,7 +74,6 @@
|
|||
<tr>
|
||||
<th name="id" >id</th>
|
||||
<th name="jobGroup" >jobGroup</th>
|
||||
<th name="jobName" >jobName</th>
|
||||
<th name="childJobKey" >任务Key</th>
|
||||
<th name="jobDesc" >描述</th>
|
||||
<th name="jobCron" >Cron</th>
|
||||
|
|
|
@ -35,19 +35,19 @@
|
|||
<div class="col-xs-3">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon">执行器</span>
|
||||
<select class="form-control" id="jobGroup" paramVal="${jobGroup}" >
|
||||
<option value="0" selected>请选择</option>
|
||||
<select class="form-control" id="jobGroup" paramVal="<#if jobInfo?exists>${jobInfo.jobGroup}</#if>" >
|
||||
<option value="0" >请选择</option>
|
||||
<#list JobGroupList as group>
|
||||
<option value="${group.id}" <#if jobGroup == group.appName && false>selected</#if> >${group.title}</option>
|
||||
<option value="${group.id}" >${group.title}</option>
|
||||
</#list>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-3">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon">描述</span>
|
||||
<select class="form-control" id="jobName" paramVal="${jobName}" >
|
||||
<option value="" >请选择</option>
|
||||
<span class="input-group-addon">任务</span>
|
||||
<select class="form-control" id="jobId" paramVal="<#if jobInfo?exists>${jobInfo.id}</#if>" >
|
||||
<option value="0" >请选择</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -76,8 +76,8 @@
|
|||
<thead>
|
||||
<tr>
|
||||
<th name="id" >id</th>
|
||||
<th name="jobGroup" >任务组</th>
|
||||
<th name="jobName" >任务名</th>
|
||||
<th name="jobGroup" >执行器ID</th>
|
||||
<th name="jobId" >任务ID</th>
|
||||
<th name="executorAddress" >执行器地址</th>
|
||||
<th name="executorHandler" >JobHandler</th>
|
||||
<th name="executorParam" >任务参数</th>
|
||||
|
|
|
@ -34,12 +34,11 @@ $(function() {
|
|||
return data;
|
||||
}
|
||||
},
|
||||
{ "data": 'jobName', "visible" : false},
|
||||
{
|
||||
"data": 'childJobKey',
|
||||
"visible" : true,
|
||||
"render": function ( data, type, row ) {
|
||||
var jobKey = row.jobGroup + "_" + row.jobName;
|
||||
var jobKey = row.jobGroup + "_" + row.id;
|
||||
return jobKey;
|
||||
}
|
||||
},
|
||||
|
@ -76,7 +75,7 @@ $(function() {
|
|||
"render": function ( data, type, row ) {
|
||||
if ('NORMAL' == data) {
|
||||
return '<small class="label label-success" ><i class="fa fa-clock-o"></i>'+ data +'</small>';
|
||||
} else if ('PAUSED' == data){
|
||||
} else if ('PAUSED' == data || 'NONE' == data){
|
||||
return '<small class="label label-default" title="暂停" ><i class="fa fa-clock-o"></i>'+ data +'</small>';
|
||||
} else if ('BLOCKED' == data){
|
||||
return '<small class="label label-default" title="阻塞[串行]" ><i class="fa fa-clock-o"></i>'+ data +'</small>';
|
||||
|
@ -91,11 +90,11 @@ $(function() {
|
|||
var pause_resume = "";
|
||||
if ('NORMAL' == row.jobStatus) {
|
||||
pause_resume = '<button class="btn btn-primary btn-xs job_operate" type="job_pause" type="button">暂停</button> ';
|
||||
} else if ('PAUSED' == row.jobStatus){
|
||||
} else if ('PAUSED' == row.jobStatus || 'NONE' == row.jobStatus){
|
||||
pause_resume = '<button class="btn btn-primary btn-xs job_operate" type="job_resume" type="button">恢复</button> ';
|
||||
}
|
||||
// log url
|
||||
var logUrl = base_url +'/joblog?jobGroup='+ row.jobGroup +'&jobName='+ row.jobName;
|
||||
var logUrl = base_url +'/joblog?jobId='+ row.id;
|
||||
|
||||
// log url
|
||||
var codeBtn = "";
|
||||
|
@ -107,7 +106,6 @@ $(function() {
|
|||
// html
|
||||
var html = '<p id="'+ row.id +'" '+
|
||||
' jobGroup="'+ row.jobGroup +'" '+
|
||||
' jobName="'+ row.jobName +'" '+
|
||||
' jobCron="'+ row.jobCron +'" '+
|
||||
' jobDesc="'+ row.jobDesc +'" '+
|
||||
' author="'+ row.author +'" '+
|
||||
|
@ -188,16 +186,14 @@ $(function() {
|
|||
return;
|
||||
}
|
||||
|
||||
var jobGroup = $(this).parent('p').attr("jobGroup");
|
||||
var jobName = $(this).parent('p').attr("jobName");
|
||||
var id = $(this).parent('p').attr("id");
|
||||
|
||||
ComConfirm.show("确认" + typeName + "?", function(){
|
||||
$.ajax({
|
||||
type : 'POST',
|
||||
url : url,
|
||||
data : {
|
||||
"jobGroup" : jobGroup,
|
||||
"jobName" : jobName
|
||||
"id" : id
|
||||
},
|
||||
dataType : "json",
|
||||
success : function(data){
|
||||
|
|
|
@ -1,24 +1,22 @@
|
|||
$(function() {
|
||||
|
||||
// 任务组列表选中, 任务列表初始化和选中
|
||||
var ifParam = true;
|
||||
$("#jobGroup").on("change", function () {
|
||||
var jobGroup = $(this).children('option:selected').val();
|
||||
$.ajax({
|
||||
type : 'POST',
|
||||
async: false, // async, avoid js invoke pagelist before jobName data init
|
||||
async: false, // async, avoid js invoke pagelist before jobId data init
|
||||
url : base_url + '/joblog/getJobsByGroup',
|
||||
data : {"jobGroup":jobGroup},
|
||||
dataType : "json",
|
||||
success : function(data){
|
||||
if (data.code == 200) {
|
||||
$("#jobName").html('<option value="" >请选择</option>');
|
||||
$.each(data.content, function (n, value) {
|
||||
$("#jobName").append('<option value="' + value.jobName + '" >' + value.jobDesc + '</option>');
|
||||
$("#jobId").html('<option value="" >请选择</option>');
|
||||
$.each(data.content, function (n, value) {
|
||||
$("#jobId").append('<option value="' + value.id + '" >' + value.jobDesc + '</option>');
|
||||
});
|
||||
if ($("#jobName").attr("paramVal")){
|
||||
$("#jobName").find("option[value='" + $("#jobName").attr("paramVal") + "']").attr("selected",true);
|
||||
$("#jobName").attr("paramVal")
|
||||
if ($("#jobId").attr("paramVal")){
|
||||
$("#jobId").find("option[value='" + $("#jobId").attr("paramVal") + "']").attr("selected",true);
|
||||
}
|
||||
} else {
|
||||
ComAlertTec.show(data.msg);
|
||||
|
@ -29,7 +27,6 @@ $(function() {
|
|||
if ($("#jobGroup").attr("paramVal")){
|
||||
$("#jobGroup").find("option[value='" + $("#jobGroup").attr("paramVal") + "']").attr("selected",true);
|
||||
$("#jobGroup").change();
|
||||
$("#jobGroup").attr("")
|
||||
}
|
||||
|
||||
// 过滤时间
|
||||
|
@ -70,7 +67,7 @@ $(function() {
|
|||
data : function ( d ) {
|
||||
var obj = {};
|
||||
obj.jobGroup = $('#jobGroup').val();
|
||||
obj.jobName = $('#jobName').val();
|
||||
obj.jobId = $('#jobId').val();
|
||||
obj.filterTime = $('#filterTime').val();
|
||||
obj.start = d.start;
|
||||
obj.length = d.length;
|
||||
|
@ -82,21 +79,8 @@ $(function() {
|
|||
//"scrollX": false,
|
||||
"columns": [
|
||||
{ "data": 'id', "bSortable": false, "visible" : false},
|
||||
{
|
||||
"data": 'jobGroup',
|
||||
"visible" : false,
|
||||
"bSortable": false,
|
||||
"render": function ( data, type, row ) {
|
||||
var groupMenu = $("#jobGroup").find("option");
|
||||
for ( var index in $("#jobGroup").find("option")) {
|
||||
if ($(groupMenu[index]).attr('value') == data) {
|
||||
return $(groupMenu[index]).html();
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
},
|
||||
{ "data": 'jobName', "visible" : false},
|
||||
{ "data": 'jobGroup', "visible" : false},
|
||||
{ "data": 'jobId', "visible" : false},
|
||||
{ "data": 'executorAddress', "visible" : true},
|
||||
{
|
||||
"data": 'executorHandler',
|
||||
|
|
|
@ -29,19 +29,19 @@ public class XxlJobInfoTest {
|
|||
@Test
|
||||
public void save_load(){
|
||||
XxlJobInfo info = new XxlJobInfo();
|
||||
info.setJobName("job_name");
|
||||
info.setJobGroup(1);
|
||||
info.setJobCron("jobCron");
|
||||
int count = xxlJobInfoDao.save(info);
|
||||
System.out.println(count);
|
||||
System.out.println(info.getId());
|
||||
|
||||
XxlJobInfo item = xxlJobInfoDao.load(0 ,"job_name");
|
||||
|
||||
XxlJobInfo item = xxlJobInfoDao.loadById(2);
|
||||
System.out.println(item);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void update(){
|
||||
XxlJobInfo item = xxlJobInfoDao.load(0 ,"job_name");
|
||||
XxlJobInfo item = xxlJobInfoDao.loadById(2);
|
||||
|
||||
item.setJobCron("jobCron2");
|
||||
xxlJobInfoDao.update(item);
|
||||
|
|
|
@ -16,11 +16,10 @@ public interface ExecutorBiz {
|
|||
|
||||
/**
|
||||
* kill
|
||||
* @param jobGroup
|
||||
* @param jobName
|
||||
* @param jobId
|
||||
* @return
|
||||
*/
|
||||
public ReturnT<String> kill(String jobGroup, String jobName);
|
||||
public ReturnT<String> kill(int jobId);
|
||||
|
||||
/**
|
||||
* log
|
||||
|
|
|
@ -23,19 +23,15 @@ public class ExecutorBizImpl implements ExecutorBiz {
|
|||
}
|
||||
|
||||
@Override
|
||||
public ReturnT<String> kill(String jobGroup, String jobName) {
|
||||
|
||||
// generate jobKey
|
||||
String jobKey = jobGroup.concat("_").concat(jobName);
|
||||
|
||||
public ReturnT<String> kill(int jobId) {
|
||||
// kill handlerThread, and create new one
|
||||
JobThread jobThread = XxlJobExecutor.loadJobThread(jobKey);
|
||||
JobThread jobThread = XxlJobExecutor.loadJobThread(jobId);
|
||||
|
||||
if (jobThread != null) {
|
||||
IJobHandler handler = jobThread.getHandler();
|
||||
jobThread.toStop("人工手动终止");
|
||||
jobThread.interrupt();
|
||||
XxlJobExecutor.removeJobThread(jobKey);
|
||||
XxlJobExecutor.removeJobThread(jobId);
|
||||
return ReturnT.SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -53,11 +49,8 @@ public class ExecutorBizImpl implements ExecutorBiz {
|
|||
|
||||
@Override
|
||||
public ReturnT<String> run(TriggerParam triggerParam) {
|
||||
// generate jobKey
|
||||
String jobKey = triggerParam.getJobGroup().concat("_").concat(triggerParam.getJobName());
|
||||
|
||||
// load old thread
|
||||
JobThread jobThread = XxlJobExecutor.loadJobThread(jobKey);
|
||||
JobThread jobThread = XxlJobExecutor.loadJobThread(triggerParam.getJobId());
|
||||
|
||||
if (!triggerParam.isGlueSwitch()) {
|
||||
// bean model
|
||||
|
@ -65,11 +58,11 @@ public class ExecutorBizImpl implements ExecutorBiz {
|
|||
// valid handler instance
|
||||
IJobHandler jobHandler = XxlJobExecutor.loadJobHandler(triggerParam.getExecutorHandler());
|
||||
if (jobHandler==null) {
|
||||
return new ReturnT(ReturnT.FAIL_CODE, "job handler for jobKey=[" + jobKey + "] not found.");
|
||||
return new ReturnT(ReturnT.FAIL_CODE, "job handler for JobId=[" + triggerParam.getJobId() + "] not found.");
|
||||
}
|
||||
|
||||
if (jobThread == null) {
|
||||
jobThread = XxlJobExecutor.registJobThread(jobKey, jobHandler);
|
||||
jobThread = XxlJobExecutor.registJobThread(triggerParam.getJobId(), jobHandler);
|
||||
} else {
|
||||
// job handler update, kill old job thread
|
||||
if (jobThread.getHandler() != jobHandler) {
|
||||
|
@ -78,7 +71,7 @@ public class ExecutorBizImpl implements ExecutorBiz {
|
|||
jobThread.interrupt();
|
||||
|
||||
// new thread, with new job handler
|
||||
jobThread = XxlJobExecutor.registJobThread(jobKey, jobHandler);
|
||||
jobThread = XxlJobExecutor.registJobThread(triggerParam.getJobId(), jobHandler);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -86,11 +79,11 @@ public class ExecutorBizImpl implements ExecutorBiz {
|
|||
|
||||
// valid glueloader
|
||||
if (!GlueFactory.isActive()) {
|
||||
return new ReturnT(ReturnT.FAIL_CODE, "glueLoader for jobKey=[" + jobKey + "] not found.");
|
||||
return new ReturnT(ReturnT.FAIL_CODE, "glueLoader for JobId=[" + triggerParam.getJobId() + "] not found.");
|
||||
}
|
||||
|
||||
if (jobThread == null) {
|
||||
jobThread = XxlJobExecutor.registJobThread(jobKey, new GlueJobHandler(triggerParam.getJobGroup(), triggerParam.getJobName()));
|
||||
jobThread = XxlJobExecutor.registJobThread(triggerParam.getJobId(), new GlueJobHandler(triggerParam.getJobId()));
|
||||
} else {
|
||||
// job handler update, kill old job thread
|
||||
if (!(jobThread.getHandler() instanceof GlueJobHandler)) {
|
||||
|
@ -99,7 +92,7 @@ public class ExecutorBizImpl implements ExecutorBiz {
|
|||
jobThread.interrupt();
|
||||
|
||||
// new thread, with new job handler
|
||||
jobThread = XxlJobExecutor.registJobThread(jobKey, new GlueJobHandler(triggerParam.getJobGroup(), triggerParam.getJobName()));
|
||||
jobThread = XxlJobExecutor.registJobThread(triggerParam.getJobId(), new GlueJobHandler(triggerParam.getJobId()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,42 +9,24 @@ import java.util.Set;
|
|||
public class TriggerParam implements Serializable{
|
||||
private static final long serialVersionUID = 42L;
|
||||
|
||||
private String action;
|
||||
|
||||
private String jobGroup;
|
||||
private String jobName;
|
||||
private int jobId;
|
||||
|
||||
private String executorHandler;
|
||||
private String executorParams;
|
||||
|
||||
private boolean glueSwitch;
|
||||
|
||||
private Set<String> logAddress;
|
||||
private int logId;
|
||||
private long logDateTim;
|
||||
|
||||
public String getAction() {
|
||||
return action;
|
||||
private Set<String> logAddress;
|
||||
|
||||
public int getJobId() {
|
||||
return jobId;
|
||||
}
|
||||
|
||||
public void setAction(String action) {
|
||||
this.action = action;
|
||||
}
|
||||
|
||||
public String getJobGroup() {
|
||||
return jobGroup;
|
||||
}
|
||||
|
||||
public void setJobGroup(String jobGroup) {
|
||||
this.jobGroup = jobGroup;
|
||||
}
|
||||
|
||||
public String getJobName() {
|
||||
return jobName;
|
||||
}
|
||||
|
||||
public void setJobName(String jobName) {
|
||||
this.jobName = jobName;
|
||||
public void setJobId(int jobId) {
|
||||
this.jobId = jobId;
|
||||
}
|
||||
|
||||
public String getExecutorHandler() {
|
||||
|
@ -71,14 +53,6 @@ public class TriggerParam implements Serializable{
|
|||
this.glueSwitch = glueSwitch;
|
||||
}
|
||||
|
||||
public Set<String> getLogAddress() {
|
||||
return logAddress;
|
||||
}
|
||||
|
||||
public void setLogAddress(Set<String> logAddress) {
|
||||
this.logAddress = logAddress;
|
||||
}
|
||||
|
||||
public int getLogId() {
|
||||
return logId;
|
||||
}
|
||||
|
@ -95,18 +69,11 @@ public class TriggerParam implements Serializable{
|
|||
this.logDateTim = logDateTim;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "RequestModel{" +
|
||||
", action='" + action + '\'' +
|
||||
", jobGroup='" + jobGroup + '\'' +
|
||||
", jobName='" + jobName + '\'' +
|
||||
", executorHandler='" + executorHandler + '\'' +
|
||||
", executorParams='" + executorParams + '\'' +
|
||||
", glueSwitch=" + glueSwitch +
|
||||
", logAddress=" + logAddress +
|
||||
", logId=" + logId +
|
||||
", logDateTim=" + logDateTim +
|
||||
'}';
|
||||
public Set<String> getLogAddress() {
|
||||
return logAddress;
|
||||
}
|
||||
|
||||
public void setLogAddress(Set<String> logAddress) {
|
||||
this.logAddress = logAddress;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
|
|||
|
||||
// job thread repository destory
|
||||
if (JobThreadRepository.size() > 0) {
|
||||
for (Map.Entry<String, JobThread> item: JobThreadRepository.entrySet()) {
|
||||
for (Map.Entry<Integer, JobThread> item: JobThreadRepository.entrySet()) {
|
||||
JobThread jobThread = item.getValue();
|
||||
jobThread.toStop("Web容器销毁终止");
|
||||
jobThread.interrupt();
|
||||
|
@ -114,20 +114,20 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
|
|||
}
|
||||
|
||||
// ---------------------------------- job thread repository
|
||||
private static ConcurrentHashMap<String, JobThread> JobThreadRepository = new ConcurrentHashMap<String, JobThread>();
|
||||
public static JobThread registJobThread(String jobkey, IJobHandler handler){
|
||||
private static ConcurrentHashMap<Integer, JobThread> JobThreadRepository = new ConcurrentHashMap<Integer, JobThread>();
|
||||
public static JobThread registJobThread(int jobId, IJobHandler handler){
|
||||
JobThread jobThread = new JobThread(handler);
|
||||
jobThread.start();
|
||||
logger.info(">>>>>>>>>>> xxl-job regist JobThread success, jobkey:{}, handler:{}", new Object[]{jobkey, handler});
|
||||
JobThreadRepository.put(jobkey, jobThread); // putIfAbsent | oh my god, map's put method return the old value!!!
|
||||
logger.info(">>>>>>>>>>> xxl-job regist JobThread success, jobId:{}, handler:{}", new Object[]{jobId, handler});
|
||||
JobThreadRepository.put(jobId, jobThread); // putIfAbsent | oh my god, map's put method return the old value!!!
|
||||
return jobThread;
|
||||
}
|
||||
public static JobThread loadJobThread(String jobKey){
|
||||
JobThread jobThread = JobThreadRepository.get(jobKey);
|
||||
public static JobThread loadJobThread(int jobId){
|
||||
JobThread jobThread = JobThreadRepository.get(jobId);
|
||||
return jobThread;
|
||||
}
|
||||
public static void removeJobThread(String jobKey){
|
||||
JobThreadRepository.remove(jobKey);
|
||||
public static void removeJobThread(int jobId){
|
||||
JobThreadRepository.remove(jobId);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -112,11 +112,11 @@ public class GlueFactory implements ApplicationContextAware {
|
|||
|
||||
// ----------------------------- load instance -----------------------------
|
||||
// load new instance, prototype
|
||||
public IJobHandler loadNewInstance(String job_group, String job_name) throws Exception{
|
||||
if (job_group==null || job_group.trim().length()==0 || job_name==null || job_name.trim().length()==0) {
|
||||
public IJobHandler loadNewInstance(int jobId) throws Exception{
|
||||
if (jobId==0) {
|
||||
return null;
|
||||
}
|
||||
String codeSource = glueLoader.load(job_group, job_name);
|
||||
String codeSource = glueLoader.load(jobId);
|
||||
if (codeSource!=null && codeSource.trim().length()>0) {
|
||||
Class<?> clazz = groovyClassLoader.parseClass(codeSource);
|
||||
if (clazz != null) {
|
||||
|
@ -136,14 +136,14 @@ public class GlueFactory implements ApplicationContextAware {
|
|||
}
|
||||
|
||||
// // load instance, singleton
|
||||
private static String generateInstanceCacheKey(String job_group, String job_name){
|
||||
return job_group.concat("_").concat(job_name).concat("_instance");
|
||||
private static String generateInstanceCacheKey(int jobId){
|
||||
return String.valueOf(jobId).concat("_instance");
|
||||
}
|
||||
public IJobHandler loadInstance(String job_group, String job_name) throws Exception{
|
||||
if (job_group==null || job_group.trim().length()==0 || job_name==null || job_name.trim().length()==0) {
|
||||
public IJobHandler loadInstance(int jobId) throws Exception{
|
||||
if (jobId==0) {
|
||||
return null;
|
||||
}
|
||||
String cacheInstanceKey = generateInstanceCacheKey(job_group, job_name);
|
||||
String cacheInstanceKey = generateInstanceCacheKey(jobId);
|
||||
Object cacheInstance = LocalCache.getInstance().get(cacheInstanceKey);
|
||||
if (cacheInstance!=null) {
|
||||
if (!(cacheInstance instanceof IJobHandler)) {
|
||||
|
@ -152,7 +152,7 @@ public class GlueFactory implements ApplicationContextAware {
|
|||
}
|
||||
return (IJobHandler) cacheInstance;
|
||||
}
|
||||
Object instance = loadNewInstance(job_group, job_name);
|
||||
Object instance = loadNewInstance(jobId);
|
||||
if (instance!=null) {
|
||||
if (!(instance instanceof IJobHandler)) {
|
||||
throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadInstance error, "
|
||||
|
@ -167,8 +167,8 @@ public class GlueFactory implements ApplicationContextAware {
|
|||
}
|
||||
|
||||
// ----------------------------- util -----------------------------
|
||||
public static void glue(String job_group, String job_name, String... params) throws Exception{
|
||||
GlueFactory.glueFactory.loadInstance(job_group, job_name).execute(params);
|
||||
public static void glue(int jobId, String... params) throws Exception{
|
||||
GlueFactory.glueFactory.loadInstance(jobId).execute(params);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -8,10 +8,9 @@ public interface GlueLoader {
|
|||
|
||||
/**
|
||||
* load code source by name, ensure every load is the latest.
|
||||
* @param job_group
|
||||
* @param job_name
|
||||
* @param jobId
|
||||
* @return code source
|
||||
*/
|
||||
public String load(String job_group, String job_name);
|
||||
public String load(int jobId);
|
||||
|
||||
}
|
||||
|
|
|
@ -18,9 +18,9 @@ public class DbGlueLoader implements GlueLoader {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String load(String job_group, String job_name) {
|
||||
String sql = "SELECT glue_source FROM XXL_JOB_QRTZ_TRIGGER_INFO WHERE job_group = ? AND job_name = ?";
|
||||
List<Map<String, Object>> result = DBUtil.query(dataSource, sql, new String[]{job_group, job_name});
|
||||
public String load(int jobId) {
|
||||
String sql = "SELECT glue_source FROM XXL_JOB_QRTZ_TRIGGER_INFO WHERE id = ?";
|
||||
List<Map<String, Object>> result = DBUtil.query(dataSource, sql, new Object[]{jobId});
|
||||
if (result!=null && result.size()==1 && result.get(0)!=null && result.get(0).get("glue_source")!=null ) {
|
||||
return (String) result.get(0).get("glue_source");
|
||||
}
|
||||
|
|
|
@ -9,16 +9,14 @@ import com.xxl.job.core.handler.IJobHandler;
|
|||
*/
|
||||
public class GlueJobHandler extends IJobHandler {
|
||||
|
||||
private String job_group;
|
||||
private String job_name;
|
||||
public GlueJobHandler(String job_group, String job_name) {
|
||||
this.job_group = job_group;
|
||||
this.job_name = job_name;
|
||||
private int jobId;
|
||||
public GlueJobHandler(int jobId) {
|
||||
this.jobId = jobId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String... params) throws Exception {
|
||||
GlueFactory.glue(job_group, job_name, params);
|
||||
GlueFactory.glue(jobId, params);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue