Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
554429ea
提交
554429ea
authored
1月 16, 2016
作者:
xueli.xue
浏览文件
操作
浏览文件
下载
差异文件
重要版本升级:
1、新增“任务组”; 2、整合“远程调度”和“本地调度”;
上级
2bfd1cb7
ee501408
全部展开
显示空白字符变更
内嵌
并排
正在显示
19 个修改的文件
包含
290 行增加
和
336 行删除
+290
-336
JobInfoController.java
...c/main/java/com/xxl/job/controller/JobInfoController.java
+0
-0
JobLogController.java
...rc/main/java/com/xxl/job/controller/JobLogController.java
+5
-3
XxlJobInfo.java
...dmin/src/main/java/com/xxl/job/core/model/XxlJobInfo.java
+19
-10
XxlJobLog.java
...admin/src/main/java/com/xxl/job/core/model/XxlJobLog.java
+10
-4
DynamicSchedulerUtil.java
...main/java/com/xxl/job/core/util/DynamicSchedulerUtil.java
+71
-47
IXxlJobInfoDao.java
...b-admin/src/main/java/com/xxl/job/dao/IXxlJobInfoDao.java
+4
-5
XxlJobInfoDaoImpl.java
...src/main/java/com/xxl/job/dao/impl/XxlJobInfoDaoImpl.java
+16
-11
HttpJobBean.java
...in/src/main/java/com/xxl/job/service/job/HttpJobBean.java
+21
-21
XxlJobInfoMapper.xml
...in/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
+58
-31
XxlJobLogMapper.xml
...min/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
+5
-1
index.ftl
...-admin/src/main/webapp/WEB-INF/template/jobinfo/index.ftl
+47
-67
index.ftl
...b-admin/src/main/webapp/WEB-INF/template/joblog/index.ftl
+2
-1
jobinfo.index.1.js
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js
+0
-0
joblog.index.1.js
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js
+1
-0
XxlJobInfoTest.java
...in/src/test/java/com/xxl/job/dao/impl/XxlJobInfoTest.java
+4
-4
XxlJobLogTest.java
...min/src/test/java/com/xxl/job/dao/impl/XxlJobLogTest.java
+2
-2
DemoJobHandler.java
...main/java/com/xxl/job/service/handler/DemoJobHandler.java
+3
-4
HandlerRepository.java
...in/java/com/xxl/job/client/handler/HandlerRepository.java
+21
-122
IJobHandler.java
...src/main/java/com/xxl/job/client/handler/IJobHandler.java
+1
-3
没有找到文件。
xxl-job-admin/src/main/java/com/xxl/job/controller/JobInfoController.java
浏览文件 @
554429ea
差异被折叠。
点击展开。
xxl-job-admin/src/main/java/com/xxl/job/controller/JobLogController.java
浏览文件 @
554429ea
...
...
@@ -33,7 +33,9 @@ public class JobLogController {
public
IXxlJobLogDao
xxlJobLogDao
;
@RequestMapping
public
String
index
(
Model
model
)
{
public
String
index
(
Model
model
,
String
jobGroup
,
String
jobName
)
{
model
.
addAttribute
(
"jobGroup"
,
jobGroup
);
model
.
addAttribute
(
"jobName"
,
jobName
);
model
.
addAttribute
(
"JobGroupList"
,
JobGroupEnum
.
values
());
return
"joblog/index"
;
}
...
...
@@ -71,8 +73,8 @@ public class JobLogController {
@RequestMapping
(
"/save"
)
@ResponseBody
public
ReturnT
<
String
>
triggerLog
(
int
trigger
LogI
d
,
String
status
,
String
msg
)
{
XxlJobLog
log
=
xxlJobLogDao
.
load
(
trigger
LogI
d
);
public
ReturnT
<
String
>
triggerLog
(
int
trigger
_log_i
d
,
String
status
,
String
msg
)
{
XxlJobLog
log
=
xxlJobLogDao
.
load
(
trigger
_log_i
d
);
if
(
log
!=
null
)
{
log
.
setHandleTime
(
new
Date
());
log
.
setHandleStatus
(
status
);
...
...
xxl-job-admin/src/main/java/com/xxl/job/core/model/XxlJobInfo.java
浏览文件 @
554429ea
...
...
@@ -10,21 +10,22 @@ public class XxlJobInfo {
private
int
id
;
private
String
jobGroup
;
// base on quartz 任务组
private
String
jobName
;
// base on quartz 任务名
private
String
jobCron
;
// base on quartz 任务执行CRON表达式
private
String
jobClass
;
// base on quartz 任务执行JobBean
private
String
jobData
;
// base on db, Map-JSON-String 任务执行数据
private
String
jobGroup
;
// 任务组
private
String
jobName
;
// 任务名
private
String
jobCron
;
// 任务执行CRON表达式 【base on quartz】
private
String
jobDesc
;
private
String
jobClass
;
// 任务执行JobBean 【base on quartz】
private
String
jobData
;
// 任务执行数据 Map-JSON-String
private
Date
addTime
;
private
Date
updateTime
;
private
String
author
;
//
作者
private
String
author
;
//
负责人
private
String
alarmEmail
;
// 报警邮件
private
int
alarmThreshold
;
// 报警阀值
// copy from quartz
private
String
jobStatus
;
// 任务状态
private
String
jobStatus
;
// 任务状态
【base on quartz】
public
int
getId
()
{
return
id
;
...
...
@@ -58,6 +59,14 @@ public class XxlJobInfo {
this
.
jobCron
=
jobCron
;
}
public
String
getJobDesc
()
{
return
jobDesc
;
}
public
void
setJobDesc
(
String
jobDesc
)
{
this
.
jobDesc
=
jobDesc
;
}
public
String
getJobClass
()
{
return
jobClass
;
}
...
...
@@ -125,9 +134,9 @@ public class XxlJobInfo {
@Override
public
String
toString
()
{
return
"XxlJobInfo [id="
+
id
+
", jobGroup="
+
jobGroup
+
", jobName="
+
jobName
+
", jobCron="
+
jobCron
+
", job
Class="
+
jobClass
+
", jobData="
+
jobData
+
", addTime="
+
addTime
+
", updateTime="
+
updateTime
+
", author="
+
author
+
", alarmEmail="
+
alarmEmail
+
", alarmThreshold="
+
alarmThreshold
+
", jobStatus="
+
jobStatus
+
"]"
;
+
", job
Desc="
+
jobDesc
+
", jobClass="
+
jobClass
+
", jobData="
+
jobData
+
", addTime="
+
addTime
+
", updateTime="
+
updateTime
+
", author="
+
author
+
", alarmEmail="
+
alarmEmail
+
", alarmThreshold="
+
alarmThreshold
+
", jobStatus="
+
jobStatus
+
"]"
;
}
}
xxl-job-admin/src/main/java/com/xxl/job/core/model/XxlJobLog.java
浏览文件 @
554429ea
...
...
@@ -14,6 +14,7 @@ public class XxlJobLog {
private
String
jobGroup
;
private
String
jobName
;
private
String
jobCron
;
private
String
jobDesc
;
private
String
jobClass
;
private
String
jobData
;
...
...
@@ -26,7 +27,6 @@ public class XxlJobLog {
private
Date
handleTime
;
private
String
handleStatus
;
private
String
handleMsg
;
public
int
getId
()
{
return
id
;
}
...
...
@@ -51,6 +51,12 @@ public class XxlJobLog {
public
void
setJobCron
(
String
jobCron
)
{
this
.
jobCron
=
jobCron
;
}
public
String
getJobDesc
()
{
return
jobDesc
;
}
public
void
setJobDesc
(
String
jobDesc
)
{
this
.
jobDesc
=
jobDesc
;
}
public
String
getJobClass
()
{
return
jobClass
;
}
...
...
@@ -103,9 +109,9 @@ public class XxlJobLog {
@Override
public
String
toString
()
{
return
"XxlJobLog [id="
+
id
+
", jobGroup="
+
jobGroup
+
", jobName="
+
jobName
+
", jobCron="
+
jobCron
+
", job
Class="
+
jobClass
+
", jobData="
+
jobData
+
", triggerTime="
+
triggerTime
+
", triggerStatus="
+
triggerStatus
+
", triggerMsg="
+
triggerMsg
+
", handleTime="
+
handleTime
+
", handleStatus="
+
handleStatus
+
", handleMsg="
+
handleMsg
+
"]"
;
+
", job
Desc="
+
jobDesc
+
", jobClass="
+
jobClass
+
", jobData="
+
jobData
+
", triggerTime="
+
triggerTime
+
", triggerStatus="
+
triggerStatus
+
", triggerMsg="
+
triggerMsg
+
", handleTime="
+
handleTime
+
", handleStatus="
+
handleStatus
+
", handleMsg="
+
handleMsg
+
"]"
;
}
}
xxl-job-admin/src/main/java/com/xxl/job/core/util/DynamicSchedulerUtil.java
浏览文件 @
554429ea
...
...
@@ -3,6 +3,7 @@ package com.xxl.job.core.util;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
...
...
@@ -29,6 +30,7 @@ import org.slf4j.LoggerFactory;
import
org.springframework.beans.factory.InitializingBean
;
import
org.springframework.util.Assert
;
import
com.xxl.job.client.util.JacksonUtil
;
import
com.xxl.job.core.model.XxlJobInfo
;
import
com.xxl.job.dao.IXxlJobInfoDao
;
import
com.xxl.job.dao.IXxlJobLogDao
;
...
...
@@ -125,28 +127,41 @@ public final class DynamicSchedulerUtil implements InitializingBean {
}
}
// check if exists
public
static
boolean
checkExists
(
String
jobName
,
String
jobGroup
)
throws
SchedulerException
{
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
jobName
,
jobGroup
);
return
scheduler
.
checkExists
(
triggerKey
);
}
// addJob 新增
public
static
boolean
addJob
(
String
triggerKeyName
,
String
cronExpression
,
Class
<?
extends
Job
>
jobClass
,
Map
<
String
,
Object
>
jobData
)
throws
SchedulerException
{
@SuppressWarnings
(
"unchecked"
)
public
static
boolean
addJob
(
XxlJobInfo
jobInfo
)
throws
SchedulerException
{
// TriggerKey : name + group
String
group
=
Scheduler
.
DEFAULT_GROUP
;
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
triggerKeyName
,
group
);
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
jobInfo
.
getJobName
(),
jobInfo
.
getJobGroup
())
;
JobKey
jobKey
=
new
JobKey
(
jobInfo
.
getJobName
(),
jobInfo
.
getJobGroup
()
);
// TriggerKey valid if_exists
if
(
scheduler
.
checkExists
(
triggerKey
))
{
Trigger
trigger
=
scheduler
.
getTrigger
(
triggerKey
);
logger
.
info
(
">>>>>>>>> Already exist trigger ["
+
trigger
+
"] by key ["
+
triggerKey
+
"] in Scheduler"
);
if
(
checkExists
(
jobInfo
.
getJobName
(),
jobInfo
.
getJobGroup
()))
{
logger
.
info
(
">>>>>>>>> addJob fail, job already exist, jobInfo:{}"
,
jobInfo
);
return
false
;
}
// CronTrigger : TriggerKey + cronExpression // withMisfireHandlingInstructionDoNothing 忽略掉调度终止过程中忽略的调度
CronScheduleBuilder
cronScheduleBuilder
=
CronScheduleBuilder
.
cronSchedule
(
cronExpression
).
withMisfireHandlingInstructionDoNothing
();
CronScheduleBuilder
cronScheduleBuilder
=
CronScheduleBuilder
.
cronSchedule
(
jobInfo
.
getJobCron
()
).
withMisfireHandlingInstructionDoNothing
();
CronTrigger
cronTrigger
=
TriggerBuilder
.
newTrigger
().
withIdentity
(
triggerKey
).
withSchedule
(
cronScheduleBuilder
).
build
();
// JobDetail : jobClass
JobDetail
jobDetail
=
JobBuilder
.
newJob
(
jobClass
).
withIdentity
(
triggerKeyName
,
group
).
build
();
if
(
jobData
!=
null
&&
jobData
.
size
()
>
0
)
{
Class
<?
extends
Job
>
jobClass_
=
null
;
try
{
jobClass_
=
(
Class
<?
extends
Job
>)
Class
.
forName
(
jobInfo
.
getJobClass
());
}
catch
(
ClassNotFoundException
e
)
{
e
.
printStackTrace
();
}
JobDetail
jobDetail
=
JobBuilder
.
newJob
(
jobClass_
).
withIdentity
(
jobKey
).
build
();
if
(
jobInfo
.
getJobData
()!=
null
)
{
JobDataMap
jobDataMap
=
jobDetail
.
getJobDataMap
();
jobDataMap
.
putAll
(
jobData
);
// JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
jobDataMap
.
putAll
(
JacksonUtil
.
readValue
(
jobInfo
.
getJobData
(),
Map
.
class
)
);
// JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
}
// schedule : jobDetail + cronTrigger
...
...
@@ -156,49 +171,60 @@ public final class DynamicSchedulerUtil implements InitializingBean {
return
true
;
}
// reschedule 重置cron
public
static
boolean
rescheduleJob
(
String
triggerKeyName
,
String
cronExpression
)
throws
SchedulerException
{
// reschedule
@SuppressWarnings
(
"unchecked"
)
public
static
boolean
rescheduleJob
(
XxlJobInfo
jobInfo
)
throws
SchedulerException
{
// TriggerKey valid if_exists
if
(!
checkExists
(
jobInfo
.
getJobName
(),
jobInfo
.
getJobGroup
()))
{
logger
.
info
(
">>>>>>>>>>> rescheduleJob fail, job not exists, jobInfo:{}"
,
jobInfo
);
return
false
;
}
// TriggerKey : name + group
String
group
=
Scheduler
.
DEFAULT_GROUP
;
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
triggerKeyName
,
group
);
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
jobInfo
.
getJobName
(),
jobInfo
.
getJobGroup
())
;
JobKey
jobKey
=
new
JobKey
(
jobInfo
.
getJobName
(),
jobInfo
.
getJobGroup
()
);
boolean
result
=
false
;
if
(
scheduler
.
checkExists
(
triggerKey
))
{
// CronTrigger : TriggerKey + cronExpression
CronScheduleBuilder
cronScheduleBuilder
=
CronScheduleBuilder
.
cronSchedule
(
cronExpression
).
withMisfireHandlingInstructionDoNothing
();
CronScheduleBuilder
cronScheduleBuilder
=
CronScheduleBuilder
.
cronSchedule
(
jobInfo
.
getJobCron
()
).
withMisfireHandlingInstructionDoNothing
();
CronTrigger
cronTrigger
=
TriggerBuilder
.
newTrigger
().
withIdentity
(
triggerKey
).
withSchedule
(
cronScheduleBuilder
).
build
();
Date
date
=
scheduler
.
rescheduleJob
(
triggerKey
,
cronTrigger
);
result
=
true
;
logger
.
info
(
">>>>>>>>>>> resumeJob success, triggerKey:{}, cronExpression:{}, date:{}"
,
triggerKey
,
cronExpression
,
date
);
}
else
{
logger
.
info
(
">>>>>>>>>>> resumeJob fail, triggerKey:{}, cronExpression:{}"
,
triggerKey
,
cronExpression
);
}
return
result
;
//scheduler.rescheduleJob(triggerKey, cronTrigger);
// JobDetail-JobDataMap fresh
JobDetail
jobDetail
=
scheduler
.
getJobDetail
(
jobKey
);
JobDataMap
jobDataMap
=
jobDetail
.
getJobDataMap
();
jobDataMap
.
clear
();
jobDataMap
.
putAll
(
JacksonUtil
.
readValue
(
jobInfo
.
getJobData
(),
Map
.
class
));
// Trigger fresh
HashSet
<
Trigger
>
triggerSet
=
new
HashSet
<
Trigger
>();
triggerSet
.
add
(
cronTrigger
);
scheduler
.
scheduleJob
(
jobDetail
,
triggerSet
,
true
);
logger
.
info
(
">>>>>>>>>>> resumeJob success, jobInfo:{}"
,
jobInfo
);
return
true
;
}
// unscheduleJob
删除
public
static
boolean
removeJob
(
String
triggerKeyName
)
throws
SchedulerException
{
// unscheduleJob
public
static
boolean
removeJob
(
String
jobName
,
String
jobGroup
)
throws
SchedulerException
{
// TriggerKey : name + group
String
group
=
Scheduler
.
DEFAULT_GROUP
;
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
triggerKeyName
,
group
);
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
jobName
,
jobGroup
);
boolean
result
=
false
;
if
(
scheduler
.
checkExists
(
triggerKey
))
{
if
(
checkExists
(
jobName
,
jobGroup
))
{
result
=
scheduler
.
unscheduleJob
(
triggerKey
);
}
logger
.
info
(
">>>>>>>>>>> removeJob, triggerKey:{}, result [{}]"
,
triggerKey
,
result
);
return
result
;
}
return
true
;
}
// Pause
暂停
public
static
boolean
pauseJob
(
String
triggerKeyName
)
throws
SchedulerException
{
// Pause
public
static
boolean
pauseJob
(
String
jobName
,
String
jobGroup
)
throws
SchedulerException
{
// TriggerKey : name + group
String
group
=
Scheduler
.
DEFAULT_GROUP
;
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
triggerKeyName
,
group
);
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
jobName
,
jobGroup
);
boolean
result
=
false
;
if
(
scheduler
.
checkExists
(
triggerKey
))
{
if
(
checkExists
(
jobName
,
jobGroup
))
{
scheduler
.
pauseTrigger
(
triggerKey
);
result
=
true
;
logger
.
info
(
">>>>>>>>>>> pauseJob success, triggerKey:{}"
,
triggerKey
);
...
...
@@ -208,14 +234,13 @@ public final class DynamicSchedulerUtil implements InitializingBean {
return
result
;
}
// resume
重启
public
static
boolean
resumeJob
(
String
triggerKeyName
)
throws
SchedulerException
{
// resume
public
static
boolean
resumeJob
(
String
jobName
,
String
jobGroup
)
throws
SchedulerException
{
// TriggerKey : name + group
String
group
=
Scheduler
.
DEFAULT_GROUP
;
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
triggerKeyName
,
group
);
TriggerKey
triggerKey
=
TriggerKey
.
triggerKey
(
jobName
,
jobGroup
);
boolean
result
=
false
;
if
(
scheduler
.
checkExists
(
triggerKey
))
{
if
(
checkExists
(
jobName
,
jobGroup
))
{
scheduler
.
resumeTrigger
(
triggerKey
);
result
=
true
;
logger
.
info
(
">>>>>>>>>>> resumeJob success, triggerKey:{}"
,
triggerKey
);
...
...
@@ -225,14 +250,13 @@ public final class DynamicSchedulerUtil implements InitializingBean {
return
result
;
}
// run
执行一次
public
static
boolean
triggerJob
(
String
triggerKeyName
)
throws
SchedulerException
{
// run
public
static
boolean
triggerJob
(
String
jobName
,
String
jobGroup
)
throws
SchedulerException
{
// TriggerKey : name + group
String
group
=
Scheduler
.
DEFAULT_GROUP
;
JobKey
jobKey
=
JobKey
.
jobKey
(
triggerKeyName
,
group
);
JobKey
jobKey
=
new
JobKey
(
jobName
,
jobGroup
);
boolean
result
=
false
;
if
(
scheduler
.
checkExists
(
jobKey
))
{
if
(
checkExists
(
jobName
,
jobGroup
))
{
scheduler
.
triggerJob
(
jobKey
);
result
=
true
;
logger
.
info
(
">>>>>>>>>>> runJob success, jobKey:{}"
,
jobKey
);
...
...
xxl-job-admin/src/main/java/com/xxl/job/dao/IXxlJobInfoDao.java
浏览文件 @
554429ea
package
com
.
xxl
.
job
.
dao
;
import
java.util.Date
;
import
java.util.List
;
import
com.xxl.job.core.model.XxlJobInfo
;
...
...
@@ -11,15 +10,15 @@ import com.xxl.job.core.model.XxlJobInfo;
*/
public
interface
IXxlJobInfoDao
{
public
List
<
XxlJobInfo
>
pageList
(
int
offset
,
int
pagesize
,
String
job
Name
,
Date
addTimeStart
,
Date
addTimeEnd
);
public
int
pageListCount
(
int
offset
,
int
pagesize
,
String
job
Name
,
Date
addTimeStart
,
Date
addTimeEnd
);
public
List
<
XxlJobInfo
>
pageList
(
int
offset
,
int
pagesize
,
String
job
Group
,
String
jobName
);
public
int
pageListCount
(
int
offset
,
int
pagesize
,
String
job
Group
,
String
jobName
);
public
int
save
(
XxlJobInfo
info
);
public
XxlJobInfo
load
(
String
jobName
);
public
XxlJobInfo
load
(
String
job
Group
,
String
job
Name
);
public
int
update
(
XxlJobInfo
item
);
public
int
delete
(
String
jobName
);
public
int
delete
(
String
job
Group
,
String
job
Name
);
}
xxl-job-admin/src/main/java/com/xxl/job/dao/impl/XxlJobInfoDaoImpl.java
浏览文件 @
554429ea
package
com
.
xxl
.
job
.
dao
.
impl
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
...
...
@@ -23,25 +22,23 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao {
public
SqlSessionTemplate
sqlSessionTemplate
;
@Override
public
List
<
XxlJobInfo
>
pageList
(
int
offset
,
int
pagesize
,
String
job
Name
,
Date
addTimeStart
,
Date
addTimeEnd
)
{
public
List
<
XxlJobInfo
>
pageList
(
int
offset
,
int
pagesize
,
String
job
Group
,
String
jobName
)
{
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
(
"addTimeStart"
,
addTimeStart
);
params
.
put
(
"addTimeEnd"
,
addTimeEnd
);
return
sqlSessionTemplate
.
selectList
(
"XxlJobInfoMapper.pageList"
,
params
);
}
@Override
public
int
pageListCount
(
int
offset
,
int
pagesize
,
String
job
Name
,
Date
addTimeStart
,
Date
addTimeEnd
)
{
public
int
pageListCount
(
int
offset
,
int
pagesize
,
String
job
Group
,
String
jobName
)
{
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
(
"addTimeStart"
,
addTimeStart
);
params
.
put
(
"addTimeEnd"
,
addTimeEnd
);
return
sqlSessionTemplate
.
selectOne
(
"XxlJobInfoMapper.pageListCount"
,
params
);
}
...
...
@@ -52,8 +49,12 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao {
}
@Override
public
XxlJobInfo
load
(
String
jobName
)
{
return
sqlSessionTemplate
.
selectOne
(
"XxlJobInfoMapper.load"
,
jobName
);
public
XxlJobInfo
load
(
String
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
...
...
@@ -62,8 +63,12 @@ public class XxlJobInfoDaoImpl implements IXxlJobInfoDao {
}
@Override
public
int
delete
(
String
jobName
)
{
return
sqlSessionTemplate
.
update
(
"XxlJobInfoMapper.delete"
,
jobName
);
public
int
delete
(
String
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
);
}
}
xxl-job-admin/src/main/java/com/xxl/job/service/job/HttpJobBean.java
浏览文件 @
554429ea
...
...
@@ -5,9 +5,10 @@ import java.util.HashMap;
import
java.util.Map
;
import
org.apache.commons.lang.StringUtils
;
import
org.quartz.DisallowConcurrentExecution
;
import
org.quartz.JobExecutionContext
;
import
org.quartz.JobExecutionException
;
import
org.quartz.
impl.triggers.CronTriggerImpl
;
import
org.quartz.
JobKey
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.scheduling.quartz.QuartzJobBean
;
...
...
@@ -22,8 +23,10 @@ import com.xxl.job.core.util.PropertiesUtil;
/**
* http job bean
* “@DisallowConcurrentExecution” diable concurrent, thread size can not be only one, better given more
* @author xuxueli 2015-12-17 18:20:34
*/
@DisallowConcurrentExecution
public
class
HttpJobBean
extends
QuartzJobBean
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
HttpJobBean
.
class
);
...
...
@@ -31,35 +34,32 @@ public class HttpJobBean extends QuartzJobBean {
@Override
protected
void
executeInternal
(
JobExecutionContext
context
)
throws
JobExecutionException
{
String
triggerKey
=
context
.
getTrigger
().
getJobKey
().
getName
();
// jobDataMap 2 params
Map
<
String
,
String
>
params
=
new
HashMap
<
String
,
String
>();
XxlJobInfo
jobInfo
=
DynamicSchedulerUtil
.
xxlJobInfoDao
.
load
(
triggerKey
);
if
(
jobInfo
!=
null
&&
jobInfo
.
getJobData
()!=
null
)
{
params
=
JacksonUtil
.
readValue
(
jobInfo
.
getJobData
(),
Map
.
class
);
}
// corn
String
cornExp
=
null
;
if
(
context
.
getTrigger
()
instanceof
CronTriggerImpl
)
{
CronTriggerImpl
trigger
=
(
CronTriggerImpl
)
context
.
getTrigger
();
cornExp
=
trigger
.
getCronExpression
();
}
JobKey
jobKey
=
context
.
getTrigger
().
getJobKey
();
XxlJobInfo
jobInfo
=
DynamicSchedulerUtil
.
xxlJobInfoDao
.
load
(
jobKey
.
getGroup
(),
jobKey
.
getName
());
HashMap
<
String
,
String
>
jobDataMap
=
(
HashMap
<
String
,
String
>)
JacksonUtil
.
readValueRefer
(
jobInfo
.
getJobData
(),
Map
.
class
);
// save log
XxlJobLog
jobLog
=
new
XxlJobLog
();
jobLog
.
setJobName
(
triggerKey
);
jobLog
.
setJobCron
(
cornExp
);
jobLog
.
setJobGroup
(
jobInfo
.
getJobGroup
());
jobLog
.
setJobName
(
jobInfo
.
getJobName
());
jobLog
.
setJobCron
(
jobInfo
.
getJobCron
());
jobLog
.
setJobDesc
(
jobInfo
.
getJobDesc
());
jobLog
.
setJobClass
(
jobInfo
.
getJobClass
());
jobLog
.
setJobData
(
jobInfo
.
getJobData
());
jobLog
.
setJobClass
(
HttpJobBean
.
class
.
getName
());
jobLog
.
setJobData
(
jobInfo
.
getJobData
());
DynamicSchedulerUtil
.
xxlJobLogDao
.
save
(
jobLog
);
logger
.
info
(
">>>>>>>>>>> xxl-job trigger start, jobLog:{}"
,
jobLog
);
// trigger request
params
.
put
(
HandlerRepository
.
triggerLogId
,
String
.
valueOf
(
jobLog
.
getId
()));
params
.
put
(
HandlerRepository
.
triggerLogUrl
,
PropertiesUtil
.
getString
(
HandlerRepository
.
triggerLogUrl
));
String
[]
postResp
=
HttpUtil
.
post
(
params
.
get
(
HandlerRepository
.
job_url
),
params
);
HashMap
<
String
,
String
>
params
=
new
HashMap
<
String
,
String
>();
params
.
put
(
HandlerRepository
.
TRIGGER_LOG_URL
,
PropertiesUtil
.
getString
(
HandlerRepository
.
TRIGGER_LOG_URL
));
params
.
put
(
HandlerRepository
.
TRIGGER_LOG_ID
,
String
.
valueOf
(
jobLog
.
getId
()));
params
.
put
(
HandlerRepository
.
HANDLER_NAME
,
jobDataMap
.
get
(
HandlerRepository
.
HANDLER_NAME
));
params
.
put
(
HandlerRepository
.
HANDLER_PARAMS
,
jobDataMap
.
get
(
HandlerRepository
.
HANDLER_PARAMS
));
String
[]
postResp
=
HttpUtil
.
post
(
jobDataMap
.
get
(
HandlerRepository
.
HANDLER_ADDRESS
),
params
);
logger
.
info
(
">>>>>>>>>>> xxl-job trigger http response, jobLog.id:{}, jobLog:{}"
,
jobLog
.
getId
(),
jobLog
);
// parse trigger response
...
...
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
浏览文件 @
554429ea
...
...
@@ -6,37 +6,45 @@
<resultMap
id=
"XxlJobInfo"
type=
"com.xxl.job.core.model.XxlJobInfo"
>
<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"
/>
<result
column=
"job_class"
property=
"jobClass"
/>
<result
column=
"job_data"
property=
"jobData"
/>
<result
column=
"add_time"
property=
"addTime"
/>
<result
column=
"update_time"
property=
"updateTime"
/>
<result
column=
"author"
property=
"author"
/>
<result
column=
"alarm_email"
property=
"alarmEmail"
/>
<result
column=
"alarm_threshold"
property=
"alarmThreshold"
/>
</resultMap>
<sql
id=
"Base_Column_List"
>
t.id,
t.job_group,
t.job_name,
t.job_cron,
t.job_desc,
t.job_class,
t.job_data,
t.add_time,
t.update_time
t.update_time,
t.author,
t.alarm_email,
t.alarm_threshold
</sql>
<select
id=
"pageList"
parameterType=
"java.util.HashMap"
resultMap=
"XxlJobInfo"
>
SELECT
<include
refid=
"Base_Column_List"
/>
FROM xxl_job_qrtz_trigger_info AS t
<trim
prefix=
"WHERE"
prefixOverrides=
"AND | OR"
>
<if
test=
"job
Name != null and jobName!=
''"
>
AND t.job_
name = #{jobName
}
<if
test=
"job
Group != null and jobGroup !=
''"
>
AND t.job_
group = #{jobGroup
}
</if>
<if
test=
"addTimeStart != null"
>
AND t.add_time
<![CDATA[ > ]]>
#{addTimeStart}
</if>
<if
test=
"addTimeEnd != null"
>
AND t.add_time
<![CDATA[ < ]]>
#{addTimeEnd}
<if
test=
"jobName != null and jobName != ''"
>
AND t.job_name like CONCAT(CONCAT('%', #{jobName}), '%')
</if>
</trim>
ORDER BY id DESC
...
...
@@ -47,56 +55,74 @@
SELECT count(1)
FROM xxl_job_qrtz_trigger_info AS t
<trim
prefix=
"WHERE"
prefixOverrides=
"AND | OR"
>
<if
test=
"job
Name != null and jobName!=
''"
>
AND t.job_
name = #{jobName
}
<if
test=
"job
Group != null and jobGroup !=
''"
>
AND t.job_
group = #{jobGroup
}
</if>
<if
test=
"addTimeStart != null"
>
AND t.add_time
<![CDATA[ > ]]>
#{addTimeStart}
</if>
<if
test=
"addTimeEnd != null"
>
AND t.add_time
<![CDATA[ < ]]>
#{addTimeEnd}
<if
test=
"jobName != null and jobName != ''"
>
AND t.job_name like CONCAT(CONCAT('%', #{jobName}), '%')
</if>
</trim>
</select>
<insert
id=
"save"
parameterType=
"com.xxl.job.core.model.XxlJobInfo"
useGeneratedKeys=
"true"
keyProperty=
"id"
>
INSERT INTO `xxl_job_qrtz_trigger_info` (
`job_name`,
`job_cron`,
`job_class`,
`job_data`,
`add_time`,
`update_time`
job_group,
job_name,
job_cron,
job_desc,
job_class,
job_data,
add_time,
update_time,
author,
alarm_email,
alarm_threshold
) VALUES (
#{jobGroup},
#{jobName},
#{jobCron},
#{jobDesc},
#{jobClass},
#{jobData},
NOW(),
NOW()
NOW(),
#{author},
#{alarmEmail},
#{alarmThreshold}
);
<selectKey
resultType=
"java.lang.Integer"
order=
"AFTER"
keyProperty=
"id"
>
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
<select
id=
"load"
parameterType=
"java.
lang.String
"
resultMap=
"XxlJobInfo"
>
<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_name = #{jobName}
WHERE t.job_group = #{jobGroup}
AND t.job_name = #{jobName}
</select>
<update
id=
"update"
>
<update
id=
"update"
parameterType=
"com.xxl.job.core.model.XxlJobInfo"
>
UPDATE `xxl_job_qrtz_trigger_info`
SET `job_cron`= #{jobCron},
`job_data`= #{jobData},
`update_time`= NOW()
WHERE `id`= #{id}
SET
job_cron = #{jobCron},
job_desc = #{jobDesc},
job_data = #{jobData},
update_time = NOW(),
author = #{author},
alarm_email = #{alarmEmail},
alarm_threshold = #{alarmThreshold}
WHERE job_group = #{jobGroup}
AND job_name = #{jobName}
</update>
<delete
id=
"delete"
parameterType=
"java.lang.String"
>
delete from xxl_job_qrtz_trigger_info
where job_name = #{jobName}
DELETE
FROM
xxl_job_qrtz_trigger_info
WHERE
job_group = #{jobGroup}
AND job_name = #{jobName}
</delete>
</mapper>
\ No newline at end of file
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
浏览文件 @
554429ea
...
...
@@ -9,6 +9,7 @@
<result
column=
"job_group"
property=
"jobGroup"
/>
<result
column=
"job_name"
property=
"jobName"
/>
<result
column=
"job_cron"
property=
"jobCron"
/>
<result
column=
"job_desc"
property=
"jobDesc"
/>
<result
column=
"job_class"
property=
"jobClass"
/>
<result
column=
"job_data"
property=
"jobData"
/>
...
...
@@ -26,8 +27,9 @@
t.job_group,
t.job_name,
t.job_cron,
t.job_desc,
t.job_class,
t.job_d
ata
,
t.job_d
esc
,
t.trigger_time,
t.trigger_status,
t.trigger_msg,
...
...
@@ -94,12 +96,14 @@
`job_group`,
`job_name`,
`job_cron`,
`job_desc`,
`job_class`,
`job_data`
) VALUES (
#{jobGroup},
#{jobName},
#{jobCron},
#{jobDesc},
#{jobClass},
#{jobData}
);
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/index.ftl
浏览文件 @
554429ea
...
...
@@ -42,9 +42,7 @@
</div>
<div
class=
"col-xs-4"
>
<div
class=
"input-group"
>
<span
class=
"input-group-addon"
>
jobName
</span>
<span
class=
"input-group-addon"
>
任务名
</span>
<input
type=
"text"
class=
"form-control"
id=
"jobName"
value=
"${jobName}"
autocomplete=
"on"
>
</div>
</div>
...
...
@@ -66,63 +64,23 @@
<table
id=
"job_list"
class=
"table table-bordered table-striped"
>
<thead>
<tr>
<th>
id
</th>
<th>
任务Key
</th>
<th>
任务Cron
</th>
<th>
任务Class
</th>
<th>
状态Status
</th>
<th>
参数
</th>
<th>
addTime
</th>
<th>
updateTime
</th>
<th
name=
"id"
>
id
</th>
<th
name=
"jobGroup"
>
任务组
</th>
<th
name=
"jobName"
>
任务名
</th>
<th
name=
"jobCron"
>
Cron
</th>
<th
name=
"jobDesc"
>
描述
</th>
<th
name=
"jobClass"
>
JobBean
</th>
<th
name=
"jobData"
>
任务数据
</th>
<th
name=
"addTime"
>
新增时间
</th>
<th
name=
"updateTime"
>
更新时间
</th>
<th
name=
"author"
>
负责人
</th>
<th
name=
"alarmEmail"
>
报警邮件
</th>
<th
name=
"alarmThreshold"
>
报警阀值
</th>
<th
name=
"jobStatus"
>
状态
</th>
<th>
操作
</th>
</tr>
</thead>
<tbody>
<
#
--
<#
if
jobList
?
exists
&&
jobList
?
size
gt
0
>
<
#
list
jobList
as
item
>
<tr>
<td>
${item['TriggerKey'].name}
</td>
<td>
${item['Trigger'].cronExpression}
</td>
<td>
${item['JobDetail'].jobClass}
</td>
<td>
<
#
assign
jobDataMap =
item['JobDetail'].jobDataMap
/>
<
#
if
jobDataMap
?
exists
&&
jobDataMap
?
keys
?
size
gt
0
>
<
#
list
jobDataMap
?
keys
as
key
>
${key} = ${jobDataMap[key]}
<br>
</
#
list>
</
#
if>
</td>
<td
state=
"${item['TriggerState']}"
>
<
#
if
item
['
TriggerState
']
==
'
NORMAL
'
>
<button
class=
"btn btn-block btn-success"
type=
"button"
>
运行ing
</button>
<
#
elseif
item
['
TriggerState
']
==
'
PAUSED
'
>
<button
class=
"btn btn-block btn-warning"
type=
"button"
>
暂停ing
</button>
<
#
else
>
<button
class=
"btn btn-block"
type=
"button"
>
${item['TriggerState']}
</button>
</
#
if>
</td>
<td>
<p
name=
"${item['TriggerKey'].name}"
group=
"${item['TriggerKey'].group}"
cronExpression=
"${item['Trigger'].cronExpression}"
jobClassName=
"${item['JobDetail'].jobClass}"
jobDesc=
"${job_desc?if_exists}"
>
<
#
if
item
['
TriggerState
']
==
'
NORMAL
'
>
<button
class=
"btn btn-info btn-xs job_operate"
type=
"job_pause"
type=
"button"
>
暂停
</button>
<
#
elseif
item
['
TriggerState
']
==
'
PAUSED
'
>
<button
class=
"btn btn-info btn-xs job_operate"
type=
"job_resume"
type=
"button"
>
恢复
</button>
</
#
if>
<button
class=
"btn btn-info btn-xs job_operate"
type=
"job_trigger"
type=
"button"
>
执行一次
</button>
<button
class=
"btn btn-info btn-xs update"
type=
"button"
>
更新corn
</button>
<button
class=
"btn btn-danger btn-xs job_operate"
type=
"job_del"
type=
"button"
>
删除
</button>
<button
class=
"btn btn-warning btn-xs"
type=
"job_del"
type=
"button"
onclick=
"javascript:window.open('${request.contextPath}/joblog?jobName=${item['TriggerKey'].name}')"
>
查看日志
</button>
</p>
</td>
</tr>
</
#
list>
</
#
if>
-->
</tbody>
<tbody></tbody>
<tfoot></tfoot>
</table>
</div>
...
...
@@ -155,29 +113,51 @@
</select>
</div>
<label
for=
"firstname"
class=
"col-sm-2 control-label"
>
任务名
</label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
triggerKeyName"
placeholder=
"请输入任务Key
"
minlength=
"4"
maxlength=
"100"
></div>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
jobName"
placeholder=
"请输入“任务名”
"
minlength=
"4"
maxlength=
"100"
></div>
</div>
<div
class=
"form-group"
>
<label
for=
"lastname"
class=
"col-sm-3 control-label"
>
任务Corn
</label>
<div
class=
"col-sm-9"
><input
type=
"text"
class=
"form-control"
name=
"cronExpression"
placeholder=
"请输入任务Corn"
maxlength=
"100"
></div>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
Corn
</label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"jobCron"
placeholder=
"请输入“Corn”"
maxlength=
"100"
></div>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
描述
</label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"jobDesc"
placeholder=
"请输入“描述”"
maxlength=
"200"
></div>
</div>
<div
class=
"form-group"
>
<label
for=
"lastname"
class=
"col-sm-3 control-label"
>
任务描述
</label>
<div
class=
"col-sm-9"
><input
type=
"text"
class=
"form-control"
name=
"job_desc"
placeholder=
"请输入任务描述"
maxlength=
"200"
></div>
<label
for=
"firstname"
class=
"col-sm-2 control-label"
>
JobBean
</label>
<div
class=
"col-sm-4"
>
<select
class=
"form-control"
name=
"jobClass"
>
<
#
if
remoteJobBean
?
exists
>
<option
value=
"${remoteJobBean.name}"
jobClassType=
"remote"
>
【远程任务】
</option>
</
#
if>
<
#
if
localJobBeanList
?
exists
&&
localJobBeanList
?
size
gt
0
>
<
#
list
localJobBeanList
as
localJobBean
>
<option
value=
"${localJobBean.name}"
jobClassType=
"local"
>
${localJobBean.name}
</option>
</
#
list>
</
#
if>
</select>
</div>
<label
for=
"firstname"
class=
"col-sm-2 control-label"
>
执行参数
</label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"handler_params"
placeholder=
"请输入“执行参数”"
maxlength=
"100"
></div>
</div>
<div
class=
"form-group remote_panel"
>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
远程-机器地址
</label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"handler_address"
placeholder=
"请输入“远程-机器地址”"
maxlength=
"200"
></div>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
远程-执行器
</label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"handler_name"
placeholder=
"请输入“远程-执行器”"
maxlength=
"200"
></div>
</div>
<div
class=
"form-group"
>
<label
for=
"lastname"
class=
"col-sm-3 control-label"
>
任务URL
</label>
<div
class=
"col-sm-9"
><input
type=
"text"
class=
"form-control"
name=
"job_url"
placeholder=
"请输入任务URL"
maxlength=
"200"
></div>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
负责人
</label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"author"
placeholder=
"请输入“负责人”"
maxlength=
"200"
></div>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
报警邮件
</label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"alarm_email"
placeholder=
"请输入“报警邮件”,多个邮件地址逗号分隔"
maxlength=
"200"
></div>
</div>
<div
class=
"form-group"
>
<label
for=
"lastname"
class=
"col-sm-
3 control-label"
>
任务handler
</label>
<div
class=
"col-sm-
9"
><input
type=
"text"
class=
"form-control"
name=
"handleName"
placeholder=
"请输入任务handler
"
maxlength=
"200"
></div>
<label
for=
"lastname"
class=
"col-sm-
2 control-label"
>
报警阈值
</label>
<div
class=
"col-sm-
4"
><input
type=
"text"
class=
"form-control"
name=
"alarm_threshold"
placeholder=
"请输入“报警阈值”
"
maxlength=
"200"
></div>
</div>
<div
class=
"form-group"
>
<div
class=
"col-sm-offset-3 col-sm-9"
>
<button
type=
"submit"
class=
"btn btn-primary"
>
保存
</button>
<button
type=
"button"
class=
"btn btn-default"
data-dismiss=
"modal"
>
取消
</button>
<button
type=
"button"
class=
"btn btn-info pull-right addParam"
>
+ arg
</button>
</div>
</div>
</form>
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/index.ftl
浏览文件 @
554429ea
...
...
@@ -35,7 +35,7 @@
<span
class=
"input-group-addon"
>
任务组
</span>
<select
class=
"form-control"
id=
"jobGroup"
>
<
#
list
JobGroupList
as
group
>
<option
value=
"${group}"
<#
if
job
Info
?
exists
&&
group =
=
jobInfo
.
jobG
roup
>
selected
</
#
if>
>${group.desc}
</option>
<option
value=
"${group}"
<#
if
job
Group =
=
g
roup
>
selected
</
#
if>
>${group.desc}
</option>
</
#
list>
</select>
</div>
...
...
@@ -74,6 +74,7 @@
<th
name=
"jobGroup"
>
任务组
</th>
<th
name=
"jobName"
>
任务名
</th>
<th
name=
"jobCron"
>
Cron
</th>
<th
name=
"jobDesc"
>
描述
</th>
<th
name=
"jobClass"
>
JobBean
</th>
<th
name=
"jobData"
>
任务数据
</th>
<th
name=
"triggerTime"
>
调度时间
</th>
...
...
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js
浏览文件 @
554429ea
差异被折叠。
点击展开。
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js
浏览文件 @
554429ea
...
...
@@ -33,6 +33,7 @@ $(function() {
},
{
"data"
:
'jobName'
},
{
"data"
:
'jobCron'
,
"visible"
:
false
},
{
"data"
:
'jobDesc'
,
"visible"
:
false
},
{
"data"
:
'jobClass'
,
"visible"
:
false
},
{
"data"
:
'jobData'
,
...
...
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobInfoTest.java
浏览文件 @
554429ea
...
...
@@ -21,8 +21,8 @@ public class XxlJobInfoTest {
@Test
public
void
pageList
(){
List
<
XxlJobInfo
>
list
=
xxlJobInfoDao
.
pageList
(
0
,
20
,
null
,
null
,
null
);
int
list_count
=
xxlJobInfoDao
.
pageListCount
(
0
,
20
,
null
,
null
,
null
);
List
<
XxlJobInfo
>
list
=
xxlJobInfoDao
.
pageList
(
0
,
20
,
null
,
null
);
int
list_count
=
xxlJobInfoDao
.
pageListCount
(
0
,
20
,
null
,
null
);
System
.
out
.
println
(
list
);
System
.
out
.
println
(
list_count
);
...
...
@@ -39,13 +39,13 @@ public class XxlJobInfoTest {
System
.
out
.
println
(
count
);
System
.
out
.
println
(
info
.
getId
());
XxlJobInfo
item
=
xxlJobInfoDao
.
load
(
"job_name"
);
XxlJobInfo
item
=
xxlJobInfoDao
.
load
(
null
,
"job_name"
);
System
.
out
.
println
(
item
);
}
@Test
public
void
update
(){
XxlJobInfo
item
=
xxlJobInfoDao
.
load
(
"job_name"
);
XxlJobInfo
item
=
xxlJobInfoDao
.
load
(
null
,
"job_name"
);
item
.
setJobCron
(
"jobCron2"
);
item
.
setJobData
(
"jobData2"
);
...
...
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogTest.java
浏览文件 @
554429ea
...
...
@@ -57,8 +57,8 @@ public class XxlJobLogTest {
@Test
public
void
pageList
(){
List
<
XxlJobLog
>
list
=
xxlJobLogDao
.
pageList
(
0
,
20
,
null
,
null
,
null
);
int
list_count
=
xxlJobLogDao
.
pageListCount
(
0
,
20
,
null
,
null
,
null
);
List
<
XxlJobLog
>
list
=
xxlJobLogDao
.
pageList
(
0
,
20
,
null
,
null
,
null
,
null
);
int
list_count
=
xxlJobLogDao
.
pageListCount
(
0
,
20
,
null
,
null
,
null
,
null
);
System
.
out
.
println
(
list
);
System
.
out
.
println
(
list_count
);
...
...
xxl-job-client-demo/src/main/java/com/xxl/job/service/handler/DemoJobHandler.java
浏览文件 @
554429ea
package
com
.
xxl
.
job
.
service
.
handler
;
import
java.util.Map
;
import
java.util.Random
;
import
java.util.concurrent.TimeUnit
;
...
...
@@ -20,12 +19,12 @@ public class DemoJobHandler extends IJobHandler {
private
static
transient
Logger
logger
=
LoggerFactory
.
getLogger
(
DemoJobHandler
.
class
);
public
DemoJobHandler
()
{
HandlerRepository
.
regist
(
DemoJobHandler
.
class
.
getName
()
,
this
);
HandlerRepository
.
regist
(
"demoJobHandler"
,
this
);
}
@Override
public
JobHandleStatus
handle
(
Map
<
String
,
String
>
param
)
throws
Exception
{
logger
.
info
(
" ... param
:{}"
,
param
);
public
JobHandleStatus
handle
(
String
...
params
)
throws
Exception
{
logger
.
info
(
" ... param
s:"
+
params
);
TimeUnit
.
SECONDS
.
sleep
(
new
Random
().
nextInt
(
5
));
return
JobHandleStatus
.
SUCCESS
;
}
...
...
xxl-job-client/src/main/java/com/xxl/job/client/handler/HandlerRepository.java
浏览文件 @
554429ea
package
com
.
xxl
.
job
.
client
.
handler
;
import
java.io.PrintWriter
;
import
java.io.StringWriter
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.LinkedBlockingQueue
;
import
java.util.concurrent.TimeUnit
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.xxl.job.client.handler.IJobHandler.JobHandleStatus
;
import
com.xxl.job.client.util.HttpUtil
;
import
com.xxl.job.client.util.JacksonUtil
;
/**
* handler repository
* @author xuxueli 2015-12-19 19:28:44
...
...
@@ -23,142 +17,47 @@ import com.xxl.job.client.util.JacksonUtil;
public
class
HandlerRepository
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
HandlerRepository
.
class
);
public
static
final
String
job_desc
=
"job_desc"
;
public
static
final
String
job_url
=
"job_url"
;
public
static
final
String
handleName
=
"handleName"
;
public
static
final
String
triggerLogId
=
"triggerLogId"
;
public
static
final
String
triggerLogUrl
=
"triggerLogUrl"
;
public
static
final
String
HANDLER_ADDRESS
=
"handler_address"
;
public
static
final
String
HANDLER_NAME
=
"handler_name"
;
public
static
final
String
HANDLER_PARAMS
=
"handler_params"
;
public
static
final
String
TRIGGER_LOG_ID
=
"trigger_log_id"
;
public
static
final
String
TRIGGER_LOG_URL
=
"trigger_log_url"
;
// handler class map
private
static
ConcurrentHashMap
<
String
,
IJobHandler
>
handlerClassMap
=
new
ConcurrentHashMap
<
String
,
IJobHandler
>();
// handler thread map
private
static
ConcurrentHashMap
<
String
,
HandlerThread
>
handlerTreadMap
=
new
ConcurrentHashMap
<
String
,
HandlerThread
>();
// handler date queue map
private
static
ConcurrentHashMap
<
String
,
LinkedBlockingQueue
<
Map
<
String
,
String
>>>
handlerDataQueueMap
=
new
ConcurrentHashMap
<
String
,
LinkedBlockingQueue
<
Map
<
String
,
String
>>>();
public
static
ConcurrentHashMap
<
String
,
HandlerThread
>
handlerTreadMap
=
new
ConcurrentHashMap
<
String
,
HandlerThread
>();
// regist handler
public
static
void
regist
(
String
handleName
,
IJobHandler
handler
){
handlerClassMap
.
put
(
handleName
,
handler
);
LinkedBlockingQueue
<
Map
<
String
,
String
>>
handlerDateQueue
=
new
LinkedBlockingQueue
<
Map
<
String
,
String
>>();
handlerDataQueueMap
.
put
(
handleName
,
handlerDateQueue
);
HandlerThread
handlerThread
=
new
HandlerThread
(
handleName
);
HandlerThread
handlerThread
=
new
HandlerThread
(
handler
);
handlerThread
.
start
();
handlerTreadMap
.
put
(
handleName
,
handlerThread
);
logger
.
info
(
">>>>>>>>>>> xxl-job regist handler success, handleName:{}, handler:{}, handlerDateQueue:{}, handlerThread:{}"
,
new
Object
[]{
handleName
,
handler
,
handlerDateQueue
,
handlerThread
});
}
// create handler thread
static
class
HandlerThread
extends
Thread
{
private
String
_handleName
;
public
HandlerThread
(
String
_handleName
)
{
this
.
_handleName
=
_handleName
;
}
public
boolean
isValid
=
true
;
public
void
stopThread
(){
isValid
=
false
;
}
@Override
public
void
run
()
{
while
(
isValid
)
{
LinkedBlockingQueue
<
Map
<
String
,
String
>>
handlerDateQueue
=
handlerDataQueueMap
.
get
(
_handleName
);
Map
<
String
,
String
>
handlerData
=
handlerDateQueue
.
poll
();
if
(
handlerData
!=
null
)
{
// handle job
JobHandleStatus
_status
=
JobHandleStatus
.
FAIL
;
String
_msg
=
null
;
try
{
IJobHandler
handler
=
handlerClassMap
.
get
(
_handleName
);
_status
=
handler
.
handle
(
handlerData
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
_status
=
JobHandleStatus
.
FAIL
;
StringWriter
out
=
new
StringWriter
();
e
.
printStackTrace
(
new
PrintWriter
(
out
));
_msg
=
out
.
toString
();
}
// callback handler info
String
callback_response
[]
=
null
;
try
{
String
_triggerLogUrl
=
handlerData
.
get
(
HandlerRepository
.
triggerLogUrl
);
HashMap
<
String
,
String
>
params
=
new
HashMap
<
String
,
String
>();
params
.
put
(
HandlerRepository
.
triggerLogId
,
handlerData
.
get
(
HandlerRepository
.
triggerLogId
));
params
.
put
(
HttpUtil
.
status
,
_status
.
name
());
params
.
put
(
HttpUtil
.
msg
,
_msg
);
callback_response
=
HttpUtil
.
post
(
_triggerLogUrl
,
params
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
logger
.
info
(
"<<<<<<<<<<< xxl-job thread handle, handlerData:{}, callback_status:{}, callback_msg:{}, callback_response:{}, thread:{}"
,
new
Object
[]{
handlerData
,
_status
,
_msg
,
callback_response
,
this
});
}
else
{
try
{
TimeUnit
.
MILLISECONDS
.
sleep
(
200
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
}
}
handlerTreadMap
.
put
(
handleName
,
handlerThread
);
// putIfAbsent
logger
.
info
(
">>>>>>>>>>> xxl-job regist handler success, handleName:{}, handler:{}"
,
new
Object
[]{
handleName
,
handler
});
}
// handler push to queue
public
static
String
pushHandleQueue
(
Map
<
String
,
String
>
_param
)
{
logger
.
info
(
">>>>>>>>>>> xxl-job pushHandleQueue start, _param:{}"
,
new
Object
[]{
_param
});
// resu
o
lt
// result
String
_status
=
HttpUtil
.
FAIL
;
String
_msg
=
""
;
// push data to queue
String
_handleName
=
_param
.
get
(
HandlerRepository
.
handleName
);
int
_triggerLogId
=
Integer
.
valueOf
(
_param
.
get
(
HandlerRepository
.
triggerLogId
));
// 次数应校验,停止队列功能为开发
try
{
if
(
_handleName
!=
null
&&
_handleName
.
trim
().
length
()>
0
)
{
IJobHandler
handler
=
handlerClassMap
.
get
(
_handleName
);
if
(
handler
!=
null
)
{
// push data to handler queue
LinkedBlockingQueue
<
Map
<
String
,
String
>>
handlerDateQueue
=
handlerDataQueueMap
.
get
(
_handleName
);
if
(
handlerDateQueue
==
null
)
{
handlerDateQueue
=
new
LinkedBlockingQueue
<
Map
<
String
,
String
>>();
handlerDataQueueMap
.
put
(
_handleName
,
handlerDateQueue
);
logger
.
info
(
">>>>>>>>>>> xxl-job handler lazy fresh handlerDateQueue, _handleName:{}, handler:{}, handlerDateQueue:{}"
,
new
Object
[]{
_handleName
,
handler
,
handlerDateQueue
});
}
// check handler thread
HandlerThread
handlerThreadOld
=
handlerTreadMap
.
get
(
_handleName
);
if
(!
handlerThreadOld
.
isAlive
())
{
handlerThreadOld
.
stopThread
();
HandlerThread
handlerThread
=
new
HandlerThread
(
_handleName
);
handlerThread
.
start
();
handlerTreadMap
.
put
(
_handleName
,
handlerThread
);
logger
.
info
(
">>>>>>>>>>> xxl-job handler lazy fresh thread, _handleName:{}, handler:{}, handlerThread:{}"
,
new
Object
[]{
_handleName
,
handler
,
handlerThread
});
}
// push to queue
handlerDateQueue
.
offer
(
_param
);
HandlerThread
handlerThread
=
handlerTreadMap
.
get
(
_param
.
get
(
HandlerRepository
.
HANDLER_NAME
));
if
(
handlerThread
!=
null
)
{
handlerThread
.
pushData
(
_param
);
_status
=
HttpUtil
.
SUCCESS
;
}
else
{
_msg
=
"handler not found."
;
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
StringWriter
out
=
new
StringWriter
();
e
.
printStackTrace
(
new
PrintWriter
(
out
));
_status
=
HttpUtil
.
FAIL
;
_msg
=
out
.
toString
();
}
logger
.
info
(
">>>>>>>>>>> xxl-job pushHandleQueue, _handleName:{}, _triggerLogId:{}, _param:{}, _status:{}, _msg:{}"
,
new
Object
[]{
_handleName
,
_triggerLogId
,
_param
,
_status
,
_msg
});
HashMap
<
String
,
String
>
triggerData
=
new
HashMap
<
String
,
String
>();
triggerData
.
put
(
HandlerRepository
.
TRIGGER_LOG_ID
,
_param
.
get
(
HandlerRepository
.
TRIGGER_LOG_ID
));
triggerData
.
put
(
HttpUtil
.
status
,
_status
);
triggerData
.
put
(
HttpUtil
.
msg
,
_msg
);
return
JacksonUtil
.
writeValueAsString
(
triggerData
);
/**
* trigger-log :
* trigger side : store trigger-info >> trigger request >> update trigger-response-status
* job side : handler trigger >> update trigger-result
*/
logger
.
info
(
">>>>>>>>>>> xxl-job pushHandleQueue end, triggerData:{}"
,
new
Object
[]{
triggerData
});
return
JacksonUtil
.
writeValueAsString
(
triggerData
);
}
}
xxl-job-client/src/main/java/com/xxl/job/client/handler/IJobHandler.java
浏览文件 @
554429ea
package
com
.
xxl
.
job
.
client
.
handler
;
import
java.util.Map
;
/**
* remote job handler
* @author xuxueli 2015-12-19 19:06:38
...
...
@@ -15,7 +13,7 @@ public abstract class IJobHandler extends HandlerRepository{
* @return
* @throws Exception
*/
public
abstract
JobHandleStatus
handle
(
Map
<
String
,
String
>
param
)
throws
Exception
;
public
abstract
JobHandleStatus
handle
(
String
...
params
)
throws
Exception
;
public
enum
JobHandleStatus
{
/**
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论