底层关键数据调整:JobKey的group和name属性,改为采用执行器主键ID和任务主键ID

This commit is contained in:
xueli.xue 2017-03-12 18:04:56 +08:00
parent f3573c8643
commit d66bdc8811
33 changed files with 219 additions and 337 deletions

View File

@ -738,6 +738,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
- 4、规范系统配置数据通过配置文件统一管理
- 5、执行器支持手动设置执行地址列表提供开关切换使用注册地址还是手动设置的地址
- 6、执行器路由规则第一个、循环、随机、顺序故障默认转移
- 7、底层扩展数据接口调整
- 8、新建任务默认为非运行状态
#### TODO LIST
- 1、支持脚本JOB(源码或指定路径), 即shell/python/php等, 日志实时输出并支持在线监控定制JobHandler实现;

View File

@ -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,

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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}",

View File

@ -35,12 +35,13 @@ public class RemoteHttpJobBean extends QuartzJobBean {
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
JobKey jobKey = context.getTrigger().getJobKey();
Integer jobId = Integer.valueOf(jobKey.getName());
XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId);
XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.load(Integer.valueOf(jobKey.getGroup()), jobKey.getName());
// 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 = "注册方式:";

View File

@ -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;
}

View File

@ -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() {

View File

@ -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;

View File

@ -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);

View File

@ -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(",")));

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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, "系统繁忙,请稍后重试");
}
// 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) {
// add in db
xxlJobInfoDao.save(jobInfo);
return ReturnT.SUCCESS;
} else {
int jobId = jobInfo.getId();
if (jobId < 1) {
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();

View File

@ -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,
@ -78,7 +76,6 @@
<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,
@ -94,7 +91,6 @@
child_jobkey
) VALUES (
#{jobGroup},
#{jobName},
#{jobCron},
#{jobDesc},
NOW(),
@ -109,9 +105,10 @@
#{glueRemark},
#{childJobKey}
);
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
/*SELECT @@IDENTITY AS id*/
</selectKey>-->
</insert>
<select id="loadById" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
@ -120,13 +117,6 @@
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
SET
@ -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">

View File

@ -7,7 +7,7 @@
<result column="id" property="id" />
<result column="job_group" property="jobGroup" />
<result column="job_name" property="jobName" />
<result column="job_id" property="jobId" />
<result column="executor_address" property="executorAddress" />
<result column="executor_handler" property="executorHandler" />
@ -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},
#{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>

View File

@ -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>

View File

@ -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>

View File

@ -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){

View File

@ -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>');
$("#jobId").html('<option value="" >请选择</option>');
$.each(data.content, function (n, value) {
$("#jobName").append('<option value="' + value.jobName + '" >' + value.jobDesc + '</option>');
$("#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',

View File

@ -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);

View File

@ -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

View File

@ -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()));
}
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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");
}

View File

@ -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);
}
}