Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
71e12272
提交
71e12272
authored
5月 28, 2016
作者:
xueli.xue
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
任务地址支持配置多个,进行failover
上级
e58f77dd
显示空白字符变更
内嵌
并排
正在显示
23 个修改的文件
包含
605 行增加
和
434 行删除
+605
-434
tables_xxl_job.sql
db/tables_xxl_job.sql
+10
-5
JobInfoController.java
.../java/com/xxl/job/admin/controller/JobInfoController.java
+13
-196
JobLogController.java
...n/java/com/xxl/job/admin/controller/JobLogController.java
+20
-27
RemoteHttpJobBean.java
...ava/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java
+58
-26
XxlJobInfo.java
...rc/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
+31
-20
XxlJobLog.java
...src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java
+21
-13
DynamicSchedulerUtil.java
...ava/com/xxl/job/admin/core/util/DynamicSchedulerUtil.java
+6
-8
XxlJobLogDaoImpl.java
...ain/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java
+2
-5
IXxlJobService.java
...c/main/java/com/xxl/job/admin/service/IXxlJobService.java
+33
-0
XxlJobServiceImpl.java
...ava/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
+241
-0
applicationcontext-base.xml
xxl-job-admin/src/main/resources/applicationcontext-base.xml
+1
-1
applicationcontext-database.xml
...-admin/src/main/resources/applicationcontext-database.xml
+1
-4
XxlJobInfoMapper.xml
...in/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
+16
-5
XxlJobLogMapper.xml
...min/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
+18
-5
jobinfo.index.ftl
...rc/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl
+9
-7
joblog.index.ftl
.../src/main/webapp/WEB-INF/template/joblog/joblog.index.ftl
+3
-1
jobinfo.index.1.js
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js
+21
-32
joblog.index.1.js
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js
+4
-18
XxlJobInfoTest.java
...in/src/test/java/com/xxl/job/dao/impl/XxlJobInfoTest.java
+0
-2
XxlJobLogTest.java
...min/src/test/java/com/xxl/job/dao/impl/XxlJobLogTest.java
+0
-1
HandlerRepository.java
...main/java/com/xxl/job/core/handler/HandlerRepository.java
+89
-50
HandlerThread.java
...src/main/java/com/xxl/job/core/handler/HandlerThread.java
+5
-4
HttpUtil.java
...ob-core/src/main/java/com/xxl/job/core/util/HttpUtil.java
+3
-4
没有找到文件。
db/tables_xxl_job.sql
浏览文件 @
71e12272
...
@@ -150,17 +150,19 @@ CREATE TABLE `xxl_job_qrtz_trigger_info` (
...
@@ -150,17 +150,19 @@ CREATE TABLE `xxl_job_qrtz_trigger_info` (
`job_cron`
varchar
(
128
)
NOT
NULL
COMMENT
'任务执行CORN'
,
`job_cron`
varchar
(
128
)
NOT
NULL
COMMENT
'任务执行CORN'
,
`job_desc`
varchar
(
255
)
NOT
NULL
,
`job_desc`
varchar
(
255
)
NOT
NULL
,
`job_class`
varchar
(
255
)
NOT
NULL
COMMENT
'任务执行JobBean'
,
`job_class`
varchar
(
255
)
NOT
NULL
COMMENT
'任务执行JobBean'
,
`job_data`
varchar
(
512
)
DEFAULT
NULL
COMMENT
'任务执行数据'
,
`add_time`
datetime
DEFAULT
NULL
,
`add_time`
datetime
DEFAULT
NULL
,
`update_time`
datetime
DEFAULT
NULL
,
`update_time`
datetime
DEFAULT
NULL
,
`author`
varchar
(
64
)
DEFAULT
NULL
COMMENT
'作者'
,
`author`
varchar
(
64
)
DEFAULT
NULL
COMMENT
'作者'
,
`alarm_email`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'报警邮件'
,
`alarm_email`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'报警邮件'
,
`alarm_threshold`
int
(
11
)
DEFAULT
NULL
COMMENT
'报警阀值(连续失败次数)'
,
`alarm_threshold`
int
(
11
)
DEFAULT
NULL
COMMENT
'报警阀值(连续失败次数)'
,
`executor_address`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'执行器地址,有多个则逗号分隔'
,
`executor_handler`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'执行器任务handler'
,
`executor_param`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'执行器任务参数'
,
`glue_switch`
int
(
11
)
DEFAULT
'0'
COMMENT
'GLUE模式开关:0-否,1-是'
,
`glue_switch`
int
(
11
)
DEFAULT
'0'
COMMENT
'GLUE模式开关:0-否,1-是'
,
`glue_source`
text
COMMENT
'GLUE源代码'
,
`glue_source`
text
COMMENT
'GLUE源代码'
,
`glue_remark`
varchar
(
128
)
DEFAULT
NULL
COMMENT
'GLUE备注'
,
`glue_remark`
varchar
(
128
)
DEFAULT
NULL
COMMENT
'GLUE备注'
,
PRIMARY
KEY
(
`id`
)
PRIMARY
KEY
(
`id`
)
);
)
ENGINE
=
InnoDB
AUTO_INCREMENT
=
4
DEFAULT
CHARSET
=
utf8
;
CREATE
TABLE
`xxl_job_qrtz_trigger_log`
(
CREATE
TABLE
`xxl_job_qrtz_trigger_log`
(
`id`
int
(
11
)
NOT
NULL
AUTO_INCREMENT
,
`id`
int
(
11
)
NOT
NULL
AUTO_INCREMENT
,
...
@@ -169,7 +171,9 @@ CREATE TABLE `xxl_job_qrtz_trigger_log` (
...
@@ -169,7 +171,9 @@ CREATE TABLE `xxl_job_qrtz_trigger_log` (
`job_cron`
varchar
(
128
)
NOT
NULL
COMMENT
'任务执行CORN表达式'
,
`job_cron`
varchar
(
128
)
NOT
NULL
COMMENT
'任务执行CORN表达式'
,
`job_desc`
varchar
(
255
)
NOT
NULL
,
`job_desc`
varchar
(
255
)
NOT
NULL
,
`job_class`
varchar
(
255
)
NOT
NULL
COMMENT
'任务执行JobBean'
,
`job_class`
varchar
(
255
)
NOT
NULL
COMMENT
'任务执行JobBean'
,
`job_data`
varchar
(
512
)
DEFAULT
NULL
COMMENT
'任务执行数据'
,
`executor_address`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'执行器地址,本次执行的地址'
,
`executor_handler`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'执行器任务handler'
,
`executor_param`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'executor_param'
,
`trigger_time`
datetime
DEFAULT
NULL
COMMENT
'调度-时间'
,
`trigger_time`
datetime
DEFAULT
NULL
COMMENT
'调度-时间'
,
`trigger_status`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'调度-结果'
,
`trigger_status`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'调度-结果'
,
`trigger_msg`
varchar
(
2048
)
DEFAULT
NULL
COMMENT
'调度-日志'
,
`trigger_msg`
varchar
(
2048
)
DEFAULT
NULL
COMMENT
'调度-日志'
,
...
@@ -177,7 +181,7 @@ CREATE TABLE `xxl_job_qrtz_trigger_log` (
...
@@ -177,7 +181,7 @@ CREATE TABLE `xxl_job_qrtz_trigger_log` (
`handle_status`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'执行-状态'
,
`handle_status`
varchar
(
255
)
DEFAULT
NULL
COMMENT
'执行-状态'
,
`handle_msg`
varchar
(
2048
)
DEFAULT
NULL
COMMENT
'执行-日志'
,
`handle_msg`
varchar
(
2048
)
DEFAULT
NULL
COMMENT
'执行-日志'
,
PRIMARY
KEY
(
`id`
)
PRIMARY
KEY
(
`id`
)
);
)
ENGINE
=
InnoDB
AUTO_INCREMENT
=
33
DEFAULT
CHARSET
=
utf8
;
CREATE
TABLE
`xxl_job_qrtz_trigger_logglue`
(
CREATE
TABLE
`xxl_job_qrtz_trigger_logglue`
(
`id`
int
(
11
)
NOT
NULL
AUTO_INCREMENT
,
`id`
int
(
11
)
NOT
NULL
AUTO_INCREMENT
,
...
@@ -188,7 +192,8 @@ CREATE TABLE `xxl_job_qrtz_trigger_logglue` (
...
@@ -188,7 +192,8 @@ CREATE TABLE `xxl_job_qrtz_trigger_logglue` (
`add_time`
timestamp
NULL
DEFAULT
NULL
,
`add_time`
timestamp
NULL
DEFAULT
NULL
,
`update_time`
timestamp
NULL
DEFAULT
NULL
ON
UPDATE
CURRENT_TIMESTAMP
,
`update_time`
timestamp
NULL
DEFAULT
NULL
ON
UPDATE
CURRENT_TIMESTAMP
,
PRIMARY
KEY
(
`id`
)
PRIMARY
KEY
(
`id`
)
)
;
)
ENGINE
=
InnoDB
AUTO_INCREMENT
=
5
DEFAULT
CHARSET
=
utf8
;
commit
;
commit
;
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
浏览文件 @
71e12272
package
com
.
xxl
.
job
.
admin
.
controller
;
package
com
.
xxl
.
job
.
admin
.
controller
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
javax.annotation.Resource
;
import
javax.annotation.Resource
;
import
org.apache.commons.lang.StringUtils
;
import
org.quartz.CronExpression
;
import
org.quartz.SchedulerException
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.ui.Model
;
import
org.springframework.ui.Model
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
...
@@ -16,15 +11,8 @@ import org.springframework.web.bind.annotation.RequestParam;
...
@@ -16,15 +11,8 @@ import org.springframework.web.bind.annotation.RequestParam;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
com.xxl.job.admin.core.constant.Constants.JobGroupEnum
;
import
com.xxl.job.admin.core.constant.Constants.JobGroupEnum
;
import
com.xxl.job.admin.core.jobbean.RemoteHttpJobBean
;
import
com.xxl.job.admin.core.model.ReturnT
;
import
com.xxl.job.admin.core.model.ReturnT
;
import
com.xxl.job.admin.core.model.XxlJobInfo
;
import
com.xxl.job.admin.service.IXxlJobService
;
import
com.xxl.job.admin.core.util.DynamicSchedulerUtil
;
import
com.xxl.job.admin.dao.IXxlJobInfoDao
;
import
com.xxl.job.admin.dao.IXxlJobLogDao
;
import
com.xxl.job.admin.dao.IXxlJobLogGlueDao
;
import
com.xxl.job.core.handler.HandlerRepository
;
import
com.xxl.job.core.util.JacksonUtil
;
/**
/**
* index controller
* index controller
...
@@ -35,11 +23,7 @@ import com.xxl.job.core.util.JacksonUtil;
...
@@ -35,11 +23,7 @@ import com.xxl.job.core.util.JacksonUtil;
public
class
JobInfoController
{
public
class
JobInfoController
{
@Resource
@Resource
private
IXxlJobInfoDao
xxlJobInfoDao
;
private
IXxlJobService
xxlJobService
;
@Resource
public
IXxlJobLogDao
xxlJobLogDao
;
@Resource
private
IXxlJobLogGlueDao
xxlJobLogGlueDao
;
@RequestMapping
@RequestMapping
public
String
index
(
Model
model
)
{
public
String
index
(
Model
model
)
{
...
@@ -53,219 +37,52 @@ public class JobInfoController {
...
@@ -53,219 +37,52 @@ public class JobInfoController {
@RequestParam
(
required
=
false
,
defaultValue
=
"10"
)
int
length
,
@RequestParam
(
required
=
false
,
defaultValue
=
"10"
)
int
length
,
String
jobGroup
,
String
jobName
,
String
filterTime
)
{
String
jobGroup
,
String
jobName
,
String
filterTime
)
{
// page list
return
xxlJobService
.
pageList
(
start
,
length
,
jobGroup
,
jobName
,
filterTime
);
List
<
XxlJobInfo
>
list
=
xxlJobInfoDao
.
pageList
(
start
,
length
,
jobGroup
,
jobName
);
int
list_count
=
xxlJobInfoDao
.
pageListCount
(
start
,
length
,
jobGroup
,
jobName
);
// fill job info
if
(
list
!=
null
&&
list
.
size
()>
0
)
{
for
(
XxlJobInfo
jobInfo
:
list
)
{
DynamicSchedulerUtil
.
fillJobInfo
(
jobInfo
);
}
}
// package result
Map
<
String
,
Object
>
maps
=
new
HashMap
<
String
,
Object
>();
maps
.
put
(
"recordsTotal"
,
list_count
);
// 总记录数
maps
.
put
(
"recordsFiltered"
,
list_count
);
// 过滤后的总记录数
maps
.
put
(
"data"
,
list
);
// 分页列表
return
maps
;
}
}
@RequestMapping
(
"/add"
)
@RequestMapping
(
"/add"
)
@ResponseBody
@ResponseBody
public
ReturnT
<
String
>
add
(
String
jobGroup
,
String
jobName
,
String
jobCron
,
String
jobDesc
,
public
ReturnT
<
String
>
add
(
String
jobGroup
,
String
jobName
,
String
jobCron
,
String
jobDesc
,
String
handler_address
,
String
handler_name
,
String
handler_params
,
String
executorAddress
,
String
executorHandler
,
String
executorParam
,
String
author
,
String
alarmEmail
,
int
alarmThreshold
,
String
author
,
String
alarmEmail
,
int
alarmThreshold
,
int
glueSwitch
,
String
glueSource
,
String
glueRemark
)
{
int
glueSwitch
,
String
glueSource
,
String
glueRemark
)
{
// valid
return
xxlJobService
.
add
(
jobGroup
,
jobName
,
jobCron
,
jobDesc
,
executorAddress
,
executorHandler
,
executorParam
,
if
(
JobGroupEnum
.
match
(
jobGroup
)
==
null
)
{
author
,
alarmEmail
,
alarmThreshold
,
glueSwitch
,
glueSource
,
glueRemark
);
return
new
ReturnT
<
String
>(
500
,
"请选择“任务组”"
);
}
if
(
StringUtils
.
isBlank
(
jobName
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“任务名”"
);
}
if
(!
CronExpression
.
isValidExpression
(
jobCron
))
{
return
new
ReturnT
<
String
>(
500
,
"“corn”不合法"
);
}
if
(
StringUtils
.
isBlank
(
jobDesc
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“任务描述”"
);
}
if
(
StringUtils
.
isBlank
(
handler_address
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“执行器地址”"
);
}
if
(
glueSwitch
==
0
&&
StringUtils
.
isBlank
(
handler_name
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“jobHandler”"
);
}
if
(
StringUtils
.
isBlank
(
author
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“负责人”"
);
}
if
(
StringUtils
.
isBlank
(
alarmEmail
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“报警邮件”"
);
}
if
(
alarmThreshold
<
0
)
{
alarmThreshold
=
0
;
}
try
{
if
(
DynamicSchedulerUtil
.
checkExists
(
jobName
,
jobGroup
))
{
return
new
ReturnT
<
String
>(
500
,
"此任务已存在,请更换任务组或任务名"
);
}
}
catch
(
SchedulerException
e1
)
{
e1
.
printStackTrace
();
return
new
ReturnT
<
String
>(
500
,
"此任务已存在,请更换任务组或任务名"
);
}
// parse jobDataMap
HashMap
<
String
,
String
>
jobDataMap
=
new
HashMap
<
String
,
String
>();
jobDataMap
.
put
(
HandlerRepository
.
HANDLER_ADDRESS
,
handler_address
);
jobDataMap
.
put
(
HandlerRepository
.
HANDLER_NAME
,
handler_name
);
jobDataMap
.
put
(
HandlerRepository
.
HANDLER_PARAMS
,
handler_params
);
// Backup to the database
XxlJobInfo
jobInfo
=
new
XxlJobInfo
();
jobInfo
.
setJobGroup
(
jobGroup
);
jobInfo
.
setJobName
(
jobName
);
jobInfo
.
setJobCron
(
jobCron
);
jobInfo
.
setJobDesc
(
jobDesc
);
jobInfo
.
setJobClass
(
RemoteHttpJobBean
.
class
.
getName
());
jobInfo
.
setJobData
(
JacksonUtil
.
writeValueAsString
(
jobDataMap
));
jobInfo
.
setAuthor
(
author
);
jobInfo
.
setAlarmEmail
(
alarmEmail
);
jobInfo
.
setAlarmThreshold
(
alarmThreshold
);
jobInfo
.
setGlueSwitch
(
glueSwitch
);
jobInfo
.
setGlueSource
(
glueSource
);
jobInfo
.
setGlueRemark
(
glueRemark
);
xxlJobInfoDao
.
save
(
jobInfo
);
try
{
// add job 2 quartz
boolean
result
=
DynamicSchedulerUtil
.
addJob
(
jobInfo
);
if
(
result
)
{
return
ReturnT
.
SUCCESS
;
}
else
{
xxlJobInfoDao
.
delete
(
jobGroup
,
jobName
);
return
new
ReturnT
<
String
>(
500
,
"新增任务失败"
);
}
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
ReturnT
.
FAIL
;
}
}
@RequestMapping
(
"/reschedule"
)
@RequestMapping
(
"/reschedule"
)
@ResponseBody
@ResponseBody
public
ReturnT
<
String
>
reschedule
(
String
jobGroup
,
String
jobName
,
String
jobCron
,
String
jobDesc
,
public
ReturnT
<
String
>
reschedule
(
String
jobGroup
,
String
jobName
,
String
jobCron
,
String
jobDesc
,
String
handler_address
,
String
handler_name
,
String
handler_params
,
String
executorAddress
,
String
executorHandler
,
String
executorParam
,
String
author
,
String
alarmEmail
,
int
alarmThreshold
,
int
glueSwitch
)
{
String
author
,
String
alarmEmail
,
int
alarmThreshold
,
int
glueSwitch
)
{
// valid
return
xxlJobService
.
reschedule
(
jobGroup
,
jobName
,
jobCron
,
jobDesc
,
executorAddress
,
executorHandler
,
executorParam
,
author
,
if
(
JobGroupEnum
.
match
(
jobGroup
)
==
null
)
{
alarmEmail
,
alarmThreshold
,
glueSwitch
);
return
new
ReturnT
<
String
>(
500
,
"请选择“任务组”"
);
}
if
(
StringUtils
.
isBlank
(
jobName
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“任务名”"
);
}
if
(!
CronExpression
.
isValidExpression
(
jobCron
))
{
return
new
ReturnT
<
String
>(
500
,
"“corn”不合法"
);
}
if
(
StringUtils
.
isBlank
(
jobDesc
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“任务描述”"
);
}
if
(
StringUtils
.
isBlank
(
handler_address
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“执行器地址”"
);
}
if
(
glueSwitch
==
0
&&
StringUtils
.
isBlank
(
handler_name
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“jobHandler”"
);
}
if
(
StringUtils
.
isBlank
(
author
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“负责人”"
);
}
if
(
StringUtils
.
isBlank
(
alarmEmail
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“报警邮件”"
);
}
if
(
alarmThreshold
<
0
)
{
alarmThreshold
=
0
;
}
// parse jobDataMap
HashMap
<
String
,
String
>
jobDataMap
=
new
HashMap
<
String
,
String
>();
jobDataMap
.
put
(
HandlerRepository
.
HANDLER_ADDRESS
,
handler_address
);
jobDataMap
.
put
(
HandlerRepository
.
HANDLER_NAME
,
handler_name
);
jobDataMap
.
put
(
HandlerRepository
.
HANDLER_PARAMS
,
handler_params
);
XxlJobInfo
jobInfo
=
xxlJobInfoDao
.
load
(
jobGroup
,
jobName
);
jobInfo
.
setJobCron
(
jobCron
);
jobInfo
.
setJobDesc
(
jobDesc
);
jobInfo
.
setJobData
(
JacksonUtil
.
writeValueAsString
(
jobDataMap
));
jobInfo
.
setAuthor
(
author
);
jobInfo
.
setAlarmEmail
(
alarmEmail
);
jobInfo
.
setAlarmThreshold
(
alarmThreshold
);
jobInfo
.
setGlueSwitch
(
glueSwitch
);
try
{
// fresh quartz
DynamicSchedulerUtil
.
rescheduleJob
(
jobInfo
);
// fresh db
xxlJobInfoDao
.
update
(
jobInfo
);
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
ReturnT
.
FAIL
;
}
}
@RequestMapping
(
"/remove"
)
@RequestMapping
(
"/remove"
)
@ResponseBody
@ResponseBody
public
ReturnT
<
String
>
remove
(
String
jobGroup
,
String
jobName
)
{
public
ReturnT
<
String
>
remove
(
String
jobGroup
,
String
jobName
)
{
try
{
return
xxlJobService
.
remove
(
jobGroup
,
jobName
);
DynamicSchedulerUtil
.
removeJob
(
jobName
,
jobGroup
);
xxlJobInfoDao
.
delete
(
jobGroup
,
jobName
);
xxlJobLogDao
.
delete
(
jobGroup
,
jobName
);
xxlJobLogGlueDao
.
delete
(
jobGroup
,
jobName
);
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
ReturnT
.
FAIL
;
}
}
@RequestMapping
(
"/pause"
)
@RequestMapping
(
"/pause"
)
@ResponseBody
@ResponseBody
public
ReturnT
<
String
>
pause
(
String
jobGroup
,
String
jobName
)
{
public
ReturnT
<
String
>
pause
(
String
jobGroup
,
String
jobName
)
{
try
{
return
xxlJobService
.
pause
(
jobGroup
,
jobName
);
DynamicSchedulerUtil
.
pauseJob
(
jobName
,
jobGroup
);
// jobStatus do not store
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
return
ReturnT
.
FAIL
;
}
}
}
@RequestMapping
(
"/resume"
)
@RequestMapping
(
"/resume"
)
@ResponseBody
@ResponseBody
public
ReturnT
<
String
>
resume
(
String
jobGroup
,
String
jobName
)
{
public
ReturnT
<
String
>
resume
(
String
jobGroup
,
String
jobName
)
{
try
{
return
xxlJobService
.
resume
(
jobGroup
,
jobName
);
DynamicSchedulerUtil
.
resumeJob
(
jobName
,
jobGroup
);
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
return
ReturnT
.
FAIL
;
}
}
}
@RequestMapping
(
"/trigger"
)
@RequestMapping
(
"/trigger"
)
@ResponseBody
@ResponseBody
public
ReturnT
<
String
>
triggerJob
(
String
jobGroup
,
String
jobName
)
{
public
ReturnT
<
String
>
triggerJob
(
String
jobGroup
,
String
jobName
)
{
try
{
return
xxlJobService
.
triggerJob
(
jobGroup
,
jobName
);
DynamicSchedulerUtil
.
triggerJob
(
jobName
,
jobGroup
);
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
return
ReturnT
.
FAIL
;
}
}
}
}
}
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
浏览文件 @
71e12272
...
@@ -20,10 +20,10 @@ import com.xxl.job.admin.core.constant.Constants.JobGroupEnum;
...
@@ -20,10 +20,10 @@ import com.xxl.job.admin.core.constant.Constants.JobGroupEnum;
import
com.xxl.job.admin.core.model.ReturnT
;
import
com.xxl.job.admin.core.model.ReturnT
;
import
com.xxl.job.admin.core.model.XxlJobLog
;
import
com.xxl.job.admin.core.model.XxlJobLog
;
import
com.xxl.job.admin.dao.IXxlJobLogDao
;
import
com.xxl.job.admin.dao.IXxlJobLogDao
;
import
com.xxl.job.core.handler.HandlerRepository
;
import
com.xxl.job.core.handler.HandlerRepository.ActionEnum
;
import
com.xxl.job.core.handler.HandlerRepository.HandlerParamEnum
;
import
com.xxl.job.core.util.HttpUtil
;
import
com.xxl.job.core.util.HttpUtil
;
import
com.xxl.job.core.util.HttpUtil.RemoteCallBack
;
import
com.xxl.job.core.util.HttpUtil.RemoteCallBack
;
import
com.xxl.job.core.util.JacksonUtil
;
/**
/**
* index controller
* index controller
...
@@ -41,7 +41,7 @@ public class JobLogController {
...
@@ -41,7 +41,7 @@ public class JobLogController {
model
.
addAttribute
(
"jobGroup"
,
jobGroup
);
model
.
addAttribute
(
"jobGroup"
,
jobGroup
);
model
.
addAttribute
(
"jobName"
,
jobName
);
model
.
addAttribute
(
"jobName"
,
jobName
);
model
.
addAttribute
(
"JobGroupList"
,
JobGroupEnum
.
values
());
model
.
addAttribute
(
"JobGroupList"
,
JobGroupEnum
.
values
());
return
"joblog/index"
;
return
"joblog/
joblog.
index"
;
}
}
@RequestMapping
(
"/pageList"
)
@RequestMapping
(
"/pageList"
)
...
@@ -101,21 +101,18 @@ public class JobLogController {
...
@@ -101,21 +101,18 @@ public class JobLogController {
if
(
log
==
null
)
{
if
(
log
==
null
)
{
return
new
ReturnT
<
String
>(
500
,
"参数异常"
);
return
new
ReturnT
<
String
>(
500
,
"参数异常"
);
}
}
if
(!
RemoteCallBack
.
SUCCESS
.
equals
(
log
.
getTriggerStatus
()))
{
// server address
return
new
ReturnT
<
String
>(
500
,
"调度失败,无法查看执行日志"
);
@SuppressWarnings
(
"unchecked"
)
Map
<
String
,
String
>
jobDataMap
=
JacksonUtil
.
readValue
(
log
.
getJobData
(),
Map
.
class
);
String
handler_address
=
jobDataMap
.
get
(
HandlerRepository
.
HANDLER_ADDRESS
);
if
(!
handler_address
.
startsWith
(
"http"
)){
handler_address
=
"http://"
+
handler_address
+
"/"
;
}
}
// trigger id, trigger time
// trigger id, trigger time
Map
<
String
,
String
>
reqMap
=
new
HashMap
<
String
,
String
>();
Map
<
String
,
String
>
reqMap
=
new
HashMap
<
String
,
String
>();
reqMap
.
put
(
HandlerRepository
.
NAMESPACE
,
HandlerRepository
.
NameSpaceEnum
.
LOG
.
name
());
reqMap
.
put
(
HandlerParamEnum
.
TIMESTAMP
.
name
(),
String
.
valueOf
(
System
.
currentTimeMillis
()));
reqMap
.
put
(
HandlerRepository
.
TRIGGER_LOG_ID
,
String
.
valueOf
(
id
));
reqMap
.
put
(
HandlerParamEnum
.
ACTION
.
name
(),
ActionEnum
.
LOG
.
name
());
reqMap
.
put
(
HandlerRepository
.
TRIGGER_TIMESTAMP
,
String
.
valueOf
(
log
.
getTriggerTime
().
getTime
()));
reqMap
.
put
(
HandlerParamEnum
.
LOG_ID
.
name
(),
String
.
valueOf
(
id
));
reqMap
.
put
(
HandlerParamEnum
.
LOG_DATE
.
name
(),
String
.
valueOf
(
log
.
getTriggerTime
().
getTime
()));
RemoteCallBack
callBack
=
HttpUtil
.
post
(
handler_address
,
reqMap
);
RemoteCallBack
callBack
=
HttpUtil
.
post
(
HttpUtil
.
addressToUrl
(
log
.
getExecutorAddress
())
,
reqMap
);
if
(
HttpUtil
.
RemoteCallBack
.
SUCCESS
.
equals
(
callBack
.
getStatus
()))
{
if
(
HttpUtil
.
RemoteCallBack
.
SUCCESS
.
equals
(
callBack
.
getStatus
()))
{
return
new
ReturnT
<
String
>(
callBack
.
getMsg
());
return
new
ReturnT
<
String
>(
callBack
.
getMsg
());
}
else
{
}
else
{
...
@@ -138,23 +135,19 @@ public class JobLogController {
...
@@ -138,23 +135,19 @@ public class JobLogController {
if
(
log
==
null
)
{
if
(
log
==
null
)
{
return
new
ReturnT
<
String
>(
500
,
"参数异常"
);
return
new
ReturnT
<
String
>(
500
,
"参数异常"
);
}
}
if
(!
RemoteCallBack
.
SUCCESS
.
equals
(
log
.
getTriggerStatus
()))
{
// server address
return
new
ReturnT
<
String
>(
500
,
"调度失败,无法终止日志"
);
@SuppressWarnings
(
"unchecked"
)
Map
<
String
,
String
>
jobDataMap
=
JacksonUtil
.
readValue
(
log
.
getJobData
(),
Map
.
class
);
String
handler_address
=
jobDataMap
.
get
(
HandlerRepository
.
HANDLER_ADDRESS
);
if
(!
handler_address
.
startsWith
(
"http"
)){
handler_address
=
"http://"
+
handler_address
+
"/"
;
}
}
String
handler_name
=
jobDataMap
.
get
(
HandlerRepository
.
HANDLER_NAME
);
//
trigger id, trigger time
//
request
Map
<
String
,
String
>
reqMap
=
new
HashMap
<
String
,
String
>();
Map
<
String
,
String
>
reqMap
=
new
HashMap
<
String
,
String
>();
reqMap
.
put
(
HandlerRepository
.
NAMESPACE
,
HandlerRepository
.
NameSpaceEnum
.
KILL
.
name
());
reqMap
.
put
(
HandlerParamEnum
.
TIMESTAMP
.
name
(),
String
.
valueOf
(
System
.
currentTimeMillis
()));
reqMap
.
put
(
HandlerRepository
.
HANDLER_NAME
,
handler_name
);
reqMap
.
put
(
HandlerParamEnum
.
ACTION
.
name
(),
ActionEnum
.
KILL
.
name
());
reqMap
.
put
(
HandlerRepository
.
TRIGGER_TIMESTAMP
,
String
.
valueOf
(
System
.
currentTimeMillis
()));
reqMap
.
put
(
HandlerParamEnum
.
EXECUTOR_HANDLER
.
name
(),
log
.
getExecutorHandler
());
reqMap
.
put
(
HandlerParamEnum
.
JOB_GROUP
.
name
(),
log
.
getJobGroup
());
reqMap
.
put
(
HandlerParamEnum
.
JOB_NAME
.
name
(),
log
.
getJobName
());
RemoteCallBack
callBack
=
HttpUtil
.
post
(
handler_address
,
reqMap
);
RemoteCallBack
callBack
=
HttpUtil
.
post
(
HttpUtil
.
addressToUrl
(
log
.
getExecutorAddress
())
,
reqMap
);
if
(
HttpUtil
.
RemoteCallBack
.
SUCCESS
.
equals
(
callBack
.
getStatus
()))
{
if
(
HttpUtil
.
RemoteCallBack
.
SUCCESS
.
equals
(
callBack
.
getStatus
()))
{
log
.
setHandleStatus
(
HttpUtil
.
RemoteCallBack
.
FAIL
);
log
.
setHandleStatus
(
HttpUtil
.
RemoteCallBack
.
FAIL
);
log
.
setHandleMsg
(
"人为操作主动终止"
);
log
.
setHandleMsg
(
"人为操作主动终止"
);
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java
浏览文件 @
71e12272
package
com
.
xxl
.
job
.
admin
.
core
.
jobbean
;
package
com
.
xxl
.
job
.
admin
.
core
.
jobbean
;
import
java.text.MessageFormat
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.Map
;
import
org.quartz.JobExecutionContext
;
import
org.quartz.JobExecutionContext
;
import
org.quartz.JobExecutionException
;
import
org.quartz.JobExecutionException
;
...
@@ -16,10 +16,10 @@ import com.xxl.job.admin.core.model.XxlJobInfo;
...
@@ -16,10 +16,10 @@ import com.xxl.job.admin.core.model.XxlJobInfo;
import
com.xxl.job.admin.core.model.XxlJobLog
;
import
com.xxl.job.admin.core.model.XxlJobLog
;
import
com.xxl.job.admin.core.thread.JobMonitorHelper
;
import
com.xxl.job.admin.core.thread.JobMonitorHelper
;
import
com.xxl.job.admin.core.util.DynamicSchedulerUtil
;
import
com.xxl.job.admin.core.util.DynamicSchedulerUtil
;
import
com.xxl.job.core.handler.HandlerRepository
;
import
com.xxl.job.core.handler.HandlerRepository.ActionEnum
;
import
com.xxl.job.core.handler.HandlerRepository.HandlerParamEnum
;
import
com.xxl.job.core.util.HttpUtil
;
import
com.xxl.job.core.util.HttpUtil
;
import
com.xxl.job.core.util.HttpUtil.RemoteCallBack
;
import
com.xxl.job.core.util.HttpUtil.RemoteCallBack
;
import
com.xxl.job.core.util.JacksonUtil
;
/**
/**
* http job bean
* http job bean
...
@@ -30,14 +30,12 @@ import com.xxl.job.core.util.JacksonUtil;
...
@@ -30,14 +30,12 @@ import com.xxl.job.core.util.JacksonUtil;
public
class
RemoteHttpJobBean
extends
QuartzJobBean
{
public
class
RemoteHttpJobBean
extends
QuartzJobBean
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
RemoteHttpJobBean
.
class
);
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
RemoteHttpJobBean
.
class
);
@SuppressWarnings
(
"unchecked"
)
@Override
@Override
protected
void
executeInternal
(
JobExecutionContext
context
)
protected
void
executeInternal
(
JobExecutionContext
context
)
throws
JobExecutionException
{
throws
JobExecutionException
{
JobKey
jobKey
=
context
.
getTrigger
().
getJobKey
();
JobKey
jobKey
=
context
.
getTrigger
().
getJobKey
();
XxlJobInfo
jobInfo
=
DynamicSchedulerUtil
.
xxlJobInfoDao
.
load
(
jobKey
.
getGroup
(),
jobKey
.
getName
());
XxlJobInfo
jobInfo
=
DynamicSchedulerUtil
.
xxlJobInfoDao
.
load
(
jobKey
.
getGroup
(),
jobKey
.
getName
());
HashMap
<
String
,
String
>
jobDataMap
=
(
HashMap
<
String
,
String
>)
JacksonUtil
.
readValueRefer
(
jobInfo
.
getJobData
(),
Map
.
class
);
// save log
// save log
XxlJobLog
jobLog
=
new
XxlJobLog
();
XxlJobLog
jobLog
=
new
XxlJobLog
();
jobLog
.
setJobGroup
(
jobInfo
.
getJobGroup
());
jobLog
.
setJobGroup
(
jobInfo
.
getJobGroup
());
...
@@ -45,34 +43,29 @@ public class RemoteHttpJobBean extends QuartzJobBean {
...
@@ -45,34 +43,29 @@ public class RemoteHttpJobBean extends QuartzJobBean {
jobLog
.
setJobCron
(
jobInfo
.
getJobCron
());
jobLog
.
setJobCron
(
jobInfo
.
getJobCron
());
jobLog
.
setJobDesc
(
jobInfo
.
getJobDesc
());
jobLog
.
setJobDesc
(
jobInfo
.
getJobDesc
());
jobLog
.
setJobClass
(
jobInfo
.
getJobClass
());
jobLog
.
setJobClass
(
jobInfo
.
getJobClass
());
jobLog
.
setJobData
(
jobInfo
.
getJobData
());
jobLog
.
setJobClass
(
RemoteHttpJobBean
.
class
.
getName
());
jobLog
.
setJobData
(
jobInfo
.
getJobData
());
DynamicSchedulerUtil
.
xxlJobLogDao
.
save
(
jobLog
);
DynamicSchedulerUtil
.
xxlJobLogDao
.
save
(
jobLog
);
logger
.
info
(
">>>>>>>>>>> xxl-job trigger start, job
Log:{}"
,
jobLog
);
logger
.
info
(
">>>>>>>>>>> xxl-job trigger start, job
Id:{}"
,
jobLog
.
getId
()
);
// trigger request
// trigger request
HashMap
<
String
,
String
>
params
=
new
HashMap
<
String
,
String
>();
HashMap
<
String
,
String
>
params
=
new
HashMap
<
String
,
String
>();
params
.
put
(
HandlerRepository
.
TRIGGER_TIMESTAMP
,
String
.
valueOf
(
System
.
currentTimeMillis
()));
params
.
put
(
HandlerParamEnum
.
TIMESTAMP
.
name
(),
String
.
valueOf
(
System
.
currentTimeMillis
()));
params
.
put
(
HandlerRepository
.
NAMESPACE
,
HandlerRepository
.
NameSpaceEnum
.
RUN
.
name
());
params
.
put
(
HandlerParamEnum
.
ACTION
.
name
(),
ActionEnum
.
RUN
.
name
());
params
.
put
(
HandlerRepository
.
TRIGGER_LOG_ID
,
String
.
valueOf
(
jobLog
.
getId
()));
params
.
put
(
HandlerRepository
.
TRIGGER_LOG_ADDRESS
,
XxlJobLogCallbackServer
.
getTrigger_log_address
());
params
.
put
(
HandlerRepository
.
HANDLER_NAME
,
jobDataMap
.
get
(
HandlerRepository
.
HANDLER_NAME
));
params
.
put
(
HandlerRepository
.
HANDLER_PARAMS
,
jobDataMap
.
get
(
HandlerRepository
.
HANDLER_PARAMS
));
params
.
put
(
HandlerRepository
.
HANDLER_GLUE_SWITCH
,
String
.
valueOf
(
jobInfo
.
getGlueSwitch
()));
params
.
put
(
HandlerParamEnum
.
LOG_ADDRESS
.
name
(),
XxlJobLogCallbackServer
.
getTrigger_log_address
());
params
.
put
(
HandlerRepository
.
HANDLER_JOB_GROUP
,
jobInfo
.
getJobGroup
());
params
.
put
(
HandlerParamEnum
.
LOG_ID
.
name
(),
String
.
valueOf
(
jobLog
.
getId
()));
params
.
put
(
HandlerRepository
.
HANDLER_JOB_NAME
,
jobInfo
.
getJobName
());
params
.
put
(
HandlerParamEnum
.
EXECUTOR_HANDLER
.
name
(),
jobInfo
.
getExecutorHandler
());
params
.
put
(
HandlerParamEnum
.
EXECUTOR_PARAMS
.
name
(),
jobInfo
.
getExecutorParam
());
// handler address, jetty (servlet dead)
params
.
put
(
HandlerParamEnum
.
GLUE_SWITCH
.
name
(),
String
.
valueOf
(
jobInfo
.
getGlueSwitch
()));
String
handler_address
=
jobDataMap
.
get
(
HandlerRepository
.
HANDLER_ADDRESS
);
params
.
put
(
HandlerParamEnum
.
JOB_GROUP
.
name
(),
jobInfo
.
getJobGroup
());
params
.
put
(
HandlerParamEnum
.
JOB_NAME
.
name
(),
jobInfo
.
getJobName
());
RemoteCallBack
callback
=
HttpUtil
.
post
(
HttpUtil
.
addressToUrl
(
handler_address
),
params
);
// failover trigger
logger
.
info
(
">>>>>>>>>>> xxl-job trigger http response, jobLog.id:{}, jobLog:{}, callback:{}"
,
jobLog
.
getId
(),
jobLog
,
callback
);
RemoteCallBack
callback
=
failoverTrigger
(
jobInfo
.
getExecutorAddress
(),
params
,
jobLog
);
jobLog
.
setExecutorHandler
(
jobInfo
.
getGlueSwitch
()==
0
?
jobInfo
.
getExecutorHandler
():
"GLUE任务"
);
jobLog
.
setExecutorParam
(
jobInfo
.
getExecutorParam
());
logger
.
info
(
">>>>>>>>>>> xxl-job failoverTrigger response, jobId:{}, callback:{}"
,
jobLog
.
getId
(),
callback
);
// update trigger info
// update trigger info
jobLog
.
setTriggerTime
(
new
Date
());
jobLog
.
setTriggerTime
(
new
Date
());
...
@@ -83,7 +76,45 @@ public class RemoteHttpJobBean extends QuartzJobBean {
...
@@ -83,7 +76,45 @@ public class RemoteHttpJobBean extends QuartzJobBean {
// monitor triger
// monitor triger
JobMonitorHelper
.
monitor
(
jobLog
.
getId
());
JobMonitorHelper
.
monitor
(
jobLog
.
getId
());
logger
.
info
(
">>>>>>>>>>> xxl-job trigger end, jobLog.id:{}, jobLog:{}"
,
jobLog
.
getId
(),
jobLog
);
logger
.
info
(
">>>>>>>>>>> xxl-job trigger end, jobId:{}"
,
jobLog
.
getId
());
}
/**
* failover for trigger remote address
* @param addressArr
* @return
*/
public
RemoteCallBack
failoverTrigger
(
String
handler_address
,
HashMap
<
String
,
String
>
handler_params
,
XxlJobLog
jobLog
){
if
(
handler_address
.
split
(
","
).
length
>
1
)
{
String
failoverMessage
=
""
;
for
(
String
address
:
handler_address
.
split
(
","
))
{
HashMap
<
String
,
String
>
params
=
new
HashMap
<
String
,
String
>();
params
.
put
(
HandlerParamEnum
.
TIMESTAMP
.
name
(),
String
.
valueOf
(
System
.
currentTimeMillis
()));
params
.
put
(
HandlerParamEnum
.
ACTION
.
name
(),
ActionEnum
.
BEAT
.
name
());
RemoteCallBack
beatResult
=
HttpUtil
.
post
(
HttpUtil
.
addressToUrl
(
address
),
params
);
failoverMessage
+=
MessageFormat
.
format
(
"BEAT running, <br>>>>[address] : {0}, <br>>>>[status] : {1}, <br>>>>[msg] : {2} <br><hr>"
,
address
,
beatResult
.
getStatus
(),
beatResult
.
getMsg
());
if
(
RemoteCallBack
.
SUCCESS
.
equals
(
beatResult
.
getStatus
()))
{
jobLog
.
setExecutorAddress
(
address
);
RemoteCallBack
triggerCallback
=
HttpUtil
.
post
(
HttpUtil
.
addressToUrl
(
address
),
handler_params
);
triggerCallback
.
setStatus
(
RemoteCallBack
.
SUCCESS
);
failoverMessage
+=
MessageFormat
.
format
(
"Trigger running, <br>>>>[address] : {0}, <br>>>>[status] : {1}, <br>>>>[msg] : {2} <br><hr>"
,
address
,
triggerCallback
.
getStatus
(),
triggerCallback
.
getMsg
());
triggerCallback
.
setMsg
(
failoverMessage
);
return
triggerCallback
;
}
}
RemoteCallBack
result
=
new
RemoteCallBack
();
result
.
setStatus
(
RemoteCallBack
.
FAIL
);
result
.
setMsg
(
failoverMessage
);
return
result
;
}
else
{
jobLog
.
setExecutorAddress
(
handler_address
);
RemoteCallBack
triggerCallback
=
HttpUtil
.
post
(
HttpUtil
.
addressToUrl
(
handler_address
),
handler_params
);
String
failoverMessage
=
MessageFormat
.
format
(
"Trigger running, <br>>>>[address] : {0}, <br>>>>[status] : {1}, <br>>>>[msg] : {2} <br><hr>"
,
handler_address
,
triggerCallback
.
getStatus
(),
triggerCallback
.
getMsg
());
triggerCallback
.
setMsg
(
failoverMessage
);
return
triggerCallback
;
}
}
}
}
}
\ No newline at end of file
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
浏览文件 @
71e12272
...
@@ -15,7 +15,7 @@ public class XxlJobInfo {
...
@@ -15,7 +15,7 @@ public class XxlJobInfo {
private
String
jobCron
;
// 任务执行CRON表达式 【base on quartz】
private
String
jobCron
;
// 任务执行CRON表达式 【base on quartz】
private
String
jobDesc
;
private
String
jobDesc
;
private
String
jobClass
;
// 任务执行JobBean 【base on quartz】
private
String
jobClass
;
// 任务执行JobBean 【base on quartz】
private
String
jobData
;
// 任务执行数据 Map-JSON-String
//
private String jobData; // 任务执行数据 Map-JSON-String
private
Date
addTime
;
private
Date
addTime
;
private
Date
updateTime
;
private
Date
updateTime
;
...
@@ -24,6 +24,10 @@ public class XxlJobInfo {
...
@@ -24,6 +24,10 @@ public class XxlJobInfo {
private
String
alarmEmail
;
// 报警邮件
private
String
alarmEmail
;
// 报警邮件
private
int
alarmThreshold
;
// 报警阀值
private
int
alarmThreshold
;
// 报警阀值
private
String
executorAddress
;
// 执行器地址,有多个则逗号分隔
private
String
executorHandler
;
// 执行器,任务Handler名称
private
String
executorParam
;
// 执行器,任务参数
private
int
glueSwitch
;
// GLUE模式开关:0-否,1-是
private
int
glueSwitch
;
// GLUE模式开关:0-否,1-是
private
String
glueSource
;
// GLUE源代码
private
String
glueSource
;
// GLUE源代码
private
String
glueRemark
;
// GLUE备注
private
String
glueRemark
;
// GLUE备注
...
@@ -79,14 +83,6 @@ public class XxlJobInfo {
...
@@ -79,14 +83,6 @@ public class XxlJobInfo {
this
.
jobClass
=
jobClass
;
this
.
jobClass
=
jobClass
;
}
}
public
String
getJobData
()
{
return
jobData
;
}
public
void
setJobData
(
String
jobData
)
{
this
.
jobData
=
jobData
;
}
public
Date
getAddTime
()
{
public
Date
getAddTime
()
{
return
addTime
;
return
addTime
;
}
}
...
@@ -127,12 +123,28 @@ public class XxlJobInfo {
...
@@ -127,12 +123,28 @@ public class XxlJobInfo {
this
.
alarmThreshold
=
alarmThreshold
;
this
.
alarmThreshold
=
alarmThreshold
;
}
}
public
String
get
JobStatu
s
()
{
public
String
get
ExecutorAddres
s
()
{
return
jobStatu
s
;
return
executorAddres
s
;
}
}
public
void
setJobStatus
(
String
jobStatus
)
{
public
void
setExecutorAddress
(
String
executorAddress
)
{
this
.
jobStatus
=
jobStatus
;
this
.
executorAddress
=
executorAddress
;
}
public
String
getExecutorHandler
()
{
return
executorHandler
;
}
public
void
setExecutorHandler
(
String
executorHandler
)
{
this
.
executorHandler
=
executorHandler
;
}
public
String
getExecutorParam
()
{
return
executorParam
;
}
public
void
setExecutorParam
(
String
executorParam
)
{
this
.
executorParam
=
executorParam
;
}
}
public
int
getGlueSwitch
()
{
public
int
getGlueSwitch
()
{
...
@@ -159,13 +171,12 @@ public class XxlJobInfo {
...
@@ -159,13 +171,12 @@ public class XxlJobInfo {
this
.
glueRemark
=
glueRemark
;
this
.
glueRemark
=
glueRemark
;
}
}
@Override
public
String
getJobStatus
()
{
public
String
toString
()
{
return
jobStatus
;
return
"XxlJobInfo [id="
+
id
+
", jobGroup="
+
jobGroup
+
", jobName="
+
jobName
+
", jobCron="
+
jobCron
}
+
", jobDesc="
+
jobDesc
+
", jobClass="
+
jobClass
+
", jobData="
+
jobData
+
", addTime="
+
addTime
+
", updateTime="
+
updateTime
+
", author="
+
author
+
", alarmEmail="
+
alarmEmail
public
void
setJobStatus
(
String
jobStatus
)
{
+
", alarmThreshold="
+
alarmThreshold
+
", glueSwitch="
+
glueSwitch
+
", glueSource="
+
glueSource
this
.
jobStatus
=
jobStatus
;
+
", glueRemark="
+
glueRemark
+
", jobStatus="
+
jobStatus
+
"]"
;
}
}
}
}
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java
浏览文件 @
71e12272
...
@@ -16,7 +16,10 @@ public class XxlJobLog {
...
@@ -16,7 +16,10 @@ public class XxlJobLog {
private
String
jobCron
;
private
String
jobCron
;
private
String
jobDesc
;
private
String
jobDesc
;
private
String
jobClass
;
private
String
jobClass
;
private
String
jobData
;
private
String
executorAddress
;
// 执行器地址,有多个则逗号分隔
private
String
executorHandler
;
// 执行器,任务Handler名称
private
String
executorParam
;
// 执行器,任务参数
// trigger info
// trigger info
private
Date
triggerTime
;
private
Date
triggerTime
;
...
@@ -27,6 +30,7 @@ public class XxlJobLog {
...
@@ -27,6 +30,7 @@ public class XxlJobLog {
private
Date
handleTime
;
private
Date
handleTime
;
private
String
handleStatus
;
private
String
handleStatus
;
private
String
handleMsg
;
private
String
handleMsg
;
public
int
getId
()
{
public
int
getId
()
{
return
id
;
return
id
;
}
}
...
@@ -63,11 +67,23 @@ public class XxlJobLog {
...
@@ -63,11 +67,23 @@ public class XxlJobLog {
public
void
setJobClass
(
String
jobClass
)
{
public
void
setJobClass
(
String
jobClass
)
{
this
.
jobClass
=
jobClass
;
this
.
jobClass
=
jobClass
;
}
}
public
String
getJobData
()
{
public
String
getExecutorAddress
()
{
return
jobData
;
return
executorAddress
;
}
public
void
setExecutorAddress
(
String
executorAddress
)
{
this
.
executorAddress
=
executorAddress
;
}
public
String
getExecutorHandler
()
{
return
executorHandler
;
}
}
public
void
setJobData
(
String
jobData
)
{
public
void
setExecutorHandler
(
String
executorHandler
)
{
this
.
jobData
=
jobData
;
this
.
executorHandler
=
executorHandler
;
}
public
String
getExecutorParam
()
{
return
executorParam
;
}
public
void
setExecutorParam
(
String
executorParam
)
{
this
.
executorParam
=
executorParam
;
}
}
public
Date
getTriggerTime
()
{
public
Date
getTriggerTime
()
{
return
triggerTime
;
return
triggerTime
;
...
@@ -106,12 +122,4 @@ public class XxlJobLog {
...
@@ -106,12 +122,4 @@ public class XxlJobLog {
this
.
handleMsg
=
handleMsg
;
this
.
handleMsg
=
handleMsg
;
}
}
@Override
public
String
toString
()
{
return
"XxlJobLog [id="
+
id
+
", jobGroup="
+
jobGroup
+
", jobName="
+
jobName
+
", jobCron="
+
jobCron
+
", jobDesc="
+
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/admin/core/util/DynamicSchedulerUtil.java
浏览文件 @
71e12272
...
@@ -12,7 +12,6 @@ import org.quartz.CronScheduleBuilder;
...
@@ -12,7 +12,6 @@ import org.quartz.CronScheduleBuilder;
import
org.quartz.CronTrigger
;
import
org.quartz.CronTrigger
;
import
org.quartz.Job
;
import
org.quartz.Job
;
import
org.quartz.JobBuilder
;
import
org.quartz.JobBuilder
;
import
org.quartz.JobDataMap
;
import
org.quartz.JobDetail
;
import
org.quartz.JobDetail
;
import
org.quartz.JobKey
;
import
org.quartz.JobKey
;
import
org.quartz.Scheduler
;
import
org.quartz.Scheduler
;
...
@@ -35,7 +34,6 @@ import com.xxl.job.admin.core.callback.XxlJobLogCallbackServer;
...
@@ -35,7 +34,6 @@ import com.xxl.job.admin.core.callback.XxlJobLogCallbackServer;
import
com.xxl.job.admin.core.model.XxlJobInfo
;
import
com.xxl.job.admin.core.model.XxlJobInfo
;
import
com.xxl.job.admin.dao.IXxlJobInfoDao
;
import
com.xxl.job.admin.dao.IXxlJobInfoDao
;
import
com.xxl.job.admin.dao.IXxlJobLogDao
;
import
com.xxl.job.admin.dao.IXxlJobLogDao
;
import
com.xxl.job.core.util.JacksonUtil
;
/**
/**
* base quartz scheduler util
* base quartz scheduler util
...
@@ -176,10 +174,11 @@ public final class DynamicSchedulerUtil implements ApplicationContextAware, Init
...
@@ -176,10 +174,11 @@ public final class DynamicSchedulerUtil implements ApplicationContextAware, Init
}
}
JobDetail
jobDetail
=
JobBuilder
.
newJob
(
jobClass_
).
withIdentity
(
jobKey
).
build
();
JobDetail
jobDetail
=
JobBuilder
.
newJob
(
jobClass_
).
withIdentity
(
jobKey
).
build
();
if
(
jobInfo
.
getJobData
()!=
null
)
{
/*
if (jobInfo.getJobData()!=null) {
JobDataMap jobDataMap = jobDetail.getJobDataMap();
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap
.
putAll
(
JacksonUtil
.
readValue
(
jobInfo
.
getJobData
(),
Map
.
class
));
// JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));
}
// JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
}*/
// schedule : jobDetail + cronTrigger
// schedule : jobDetail + cronTrigger
Date
date
=
scheduler
.
scheduleJob
(
jobDetail
,
cronTrigger
);
Date
date
=
scheduler
.
scheduleJob
(
jobDetail
,
cronTrigger
);
...
@@ -189,7 +188,6 @@ public final class DynamicSchedulerUtil implements ApplicationContextAware, Init
...
@@ -189,7 +188,6 @@ public final class DynamicSchedulerUtil implements ApplicationContextAware, Init
}
}
// reschedule
// reschedule
@SuppressWarnings
(
"unchecked"
)
public
static
boolean
rescheduleJob
(
XxlJobInfo
jobInfo
)
throws
SchedulerException
{
public
static
boolean
rescheduleJob
(
XxlJobInfo
jobInfo
)
throws
SchedulerException
{
// TriggerKey valid if_exists
// TriggerKey valid if_exists
...
@@ -210,9 +208,9 @@ public final class DynamicSchedulerUtil implements ApplicationContextAware, Init
...
@@ -210,9 +208,9 @@ public final class DynamicSchedulerUtil implements ApplicationContextAware, Init
// JobDetail-JobDataMap fresh
// JobDetail-JobDataMap fresh
JobDetail
jobDetail
=
scheduler
.
getJobDetail
(
jobKey
);
JobDetail
jobDetail
=
scheduler
.
getJobDetail
(
jobKey
);
JobDataMap
jobDataMap
=
jobDetail
.
getJobDataMap
();
/*
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.clear();
jobDataMap.clear();
jobDataMap
.
putAll
(
JacksonUtil
.
readValue
(
jobInfo
.
getJobData
(),
Map
.
class
));
jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));
*/
// Trigger fresh
// Trigger fresh
HashSet
<
Trigger
>
triggerSet
=
new
HashSet
<
Trigger
>();
HashSet
<
Trigger
>
triggerSet
=
new
HashSet
<
Trigger
>();
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/impl/XxlJobLogDaoImpl.java
浏览文件 @
71e12272
...
@@ -63,15 +63,12 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
...
@@ -63,15 +63,12 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
@Override
@Override
public
int
save
(
XxlJobLog
xxlJobLog
)
{
public
int
save
(
XxlJobLog
xxlJobLog
)
{
if
(
xxlJobLog
!=
null
&&
xxlJobLog
.
getJobData
().
length
()>
2000
)
{
xxlJobLog
.
setJobData
(
xxlJobLog
.
getJobData
().
substring
(
0
,
2000
));
}
return
sqlSessionTemplate
.
insert
(
"XxlJobLogMapper.save"
,
xxlJobLog
);
return
sqlSessionTemplate
.
insert
(
"XxlJobLogMapper.save"
,
xxlJobLog
);
}
}
@Override
@Override
public
int
updateTriggerInfo
(
XxlJobLog
xxlJobLog
)
{
public
int
updateTriggerInfo
(
XxlJobLog
xxlJobLog
)
{
if
(
xxlJobLog
!=
null
&&
xxlJobLog
.
getTriggerMsg
()!=
null
&&
xxlJobLog
.
getTriggerMsg
().
length
()>
2000
)
{
if
(
xxlJobLog
.
getTriggerMsg
()!=
null
&&
xxlJobLog
.
getTriggerMsg
().
length
()>
2000
)
{
xxlJobLog
.
setTriggerMsg
(
xxlJobLog
.
getTriggerMsg
().
substring
(
0
,
2000
));
xxlJobLog
.
setTriggerMsg
(
xxlJobLog
.
getTriggerMsg
().
substring
(
0
,
2000
));
}
}
return
sqlSessionTemplate
.
update
(
"XxlJobLogMapper.updateTriggerInfo"
,
xxlJobLog
);
return
sqlSessionTemplate
.
update
(
"XxlJobLogMapper.updateTriggerInfo"
,
xxlJobLog
);
...
@@ -79,7 +76,7 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
...
@@ -79,7 +76,7 @@ public class XxlJobLogDaoImpl implements IXxlJobLogDao {
@Override
@Override
public
int
updateHandleInfo
(
XxlJobLog
xxlJobLog
)
{
public
int
updateHandleInfo
(
XxlJobLog
xxlJobLog
)
{
if
(
xxlJobLog
!=
null
&&
xxlJobLog
.
getHandleMsg
()!=
null
&&
xxlJobLog
.
getHandleMsg
().
length
()>
2000
)
{
if
(
xxlJobLog
.
getHandleMsg
()!=
null
&&
xxlJobLog
.
getHandleMsg
().
length
()>
2000
)
{
xxlJobLog
.
setHandleMsg
(
xxlJobLog
.
getHandleMsg
().
substring
(
0
,
2000
));
xxlJobLog
.
setHandleMsg
(
xxlJobLog
.
getHandleMsg
().
substring
(
0
,
2000
));
}
}
return
sqlSessionTemplate
.
update
(
"XxlJobLogMapper.updateHandleInfo"
,
xxlJobLog
);
return
sqlSessionTemplate
.
update
(
"XxlJobLogMapper.updateHandleInfo"
,
xxlJobLog
);
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/service/IXxlJobService.java
0 → 100644
浏览文件 @
71e12272
package
com
.
xxl
.
job
.
admin
.
service
;
import
java.util.Map
;
import
com.xxl.job.admin.core.model.ReturnT
;
/**
* core job service for xxl-job
*
* @author xuxueli 2016-5-28 15:30:33
*/
public
interface
IXxlJobService
{
public
Map
<
String
,
Object
>
pageList
(
int
start
,
int
length
,
String
jobGroup
,
String
jobName
,
String
filterTime
);
public
ReturnT
<
String
>
add
(
String
jobGroup
,
String
jobName
,
String
jobCron
,
String
jobDesc
,
String
executorAddress
,
String
executorHandler
,
String
executorParam
,
String
author
,
String
alarmEmail
,
int
alarmThreshold
,
int
glueSwitch
,
String
glueSource
,
String
glueRemark
);
public
ReturnT
<
String
>
reschedule
(
String
jobGroup
,
String
jobName
,
String
jobCron
,
String
jobDesc
,
String
handler_address
,
String
handler_name
,
String
handler_params
,
String
author
,
String
alarmEmail
,
int
alarmThreshold
,
int
glueSwitch
);
public
ReturnT
<
String
>
remove
(
String
jobGroup
,
String
jobName
);
public
ReturnT
<
String
>
pause
(
String
jobGroup
,
String
jobName
);
public
ReturnT
<
String
>
resume
(
String
jobGroup
,
String
jobName
);
public
ReturnT
<
String
>
triggerJob
(
String
jobGroup
,
String
jobName
);
}
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
0 → 100644
浏览文件 @
71e12272
package
com
.
xxl
.
job
.
admin
.
service
.
impl
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
javax.annotation.Resource
;
import
org.apache.commons.lang.StringUtils
;
import
org.quartz.CronExpression
;
import
org.quartz.SchedulerException
;
import
org.springframework.stereotype.Service
;
import
com.xxl.job.admin.core.constant.Constants.JobGroupEnum
;
import
com.xxl.job.admin.core.jobbean.RemoteHttpJobBean
;
import
com.xxl.job.admin.core.model.ReturnT
;
import
com.xxl.job.admin.core.model.XxlJobInfo
;
import
com.xxl.job.admin.core.util.DynamicSchedulerUtil
;
import
com.xxl.job.admin.dao.IXxlJobInfoDao
;
import
com.xxl.job.admin.dao.IXxlJobLogDao
;
import
com.xxl.job.admin.dao.IXxlJobLogGlueDao
;
import
com.xxl.job.admin.service.IXxlJobService
;
/**
* core job service for xxl-job
* @author xuxueli 2016-5-28 15:30:33
*/
@Service
public
class
XxlJobServiceImpl
implements
IXxlJobService
{
@Resource
private
IXxlJobInfoDao
xxlJobInfoDao
;
@Resource
public
IXxlJobLogDao
xxlJobLogDao
;
@Resource
private
IXxlJobLogGlueDao
xxlJobLogGlueDao
;
@Override
public
Map
<
String
,
Object
>
pageList
(
int
start
,
int
length
,
String
jobGroup
,
String
jobName
,
String
filterTime
)
{
// page list
List
<
XxlJobInfo
>
list
=
xxlJobInfoDao
.
pageList
(
start
,
length
,
jobGroup
,
jobName
);
int
list_count
=
xxlJobInfoDao
.
pageListCount
(
start
,
length
,
jobGroup
,
jobName
);
// fill job info
if
(
list
!=
null
&&
list
.
size
()>
0
)
{
for
(
XxlJobInfo
jobInfo
:
list
)
{
DynamicSchedulerUtil
.
fillJobInfo
(
jobInfo
);
}
}
// package result
Map
<
String
,
Object
>
maps
=
new
HashMap
<
String
,
Object
>();
maps
.
put
(
"recordsTotal"
,
list_count
);
// 总记录数
maps
.
put
(
"recordsFiltered"
,
list_count
);
// 过滤后的总记录数
maps
.
put
(
"data"
,
list
);
// 分页列表
return
maps
;
}
@Override
public
ReturnT
<
String
>
add
(
String
jobGroup
,
String
jobName
,
String
jobCron
,
String
jobDesc
,
String
executorAddress
,
String
executorHandler
,
String
executorParam
,
String
author
,
String
alarmEmail
,
int
alarmThreshold
,
int
glueSwitch
,
String
glueSource
,
String
glueRemark
)
{
// valid
if
(
JobGroupEnum
.
match
(
jobGroup
)
==
null
)
{
return
new
ReturnT
<
String
>(
500
,
"请选择“任务组”"
);
}
if
(
StringUtils
.
isBlank
(
jobName
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“任务名”"
);
}
if
(!
CronExpression
.
isValidExpression
(
jobCron
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入格式正确的“corn”"
);
}
if
(
StringUtils
.
isBlank
(
jobDesc
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“任务描述”"
);
}
if
(
StringUtils
.
isBlank
(
executorAddress
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“执行器地址”"
);
}
if
(
glueSwitch
==
0
&&
StringUtils
.
isBlank
(
executorHandler
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“jobHandler”"
);
}
if
(
StringUtils
.
isBlank
(
author
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“负责人”"
);
}
if
(
StringUtils
.
isBlank
(
alarmEmail
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“报警邮件”"
);
}
if
(
alarmThreshold
<
0
)
{
alarmThreshold
=
0
;
}
try
{
if
(
DynamicSchedulerUtil
.
checkExists
(
jobName
,
jobGroup
))
{
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
.
setJobClass
(
RemoteHttpJobBean
.
class
.
getName
());
jobInfo
.
setAuthor
(
author
);
jobInfo
.
setAlarmEmail
(
alarmEmail
);
jobInfo
.
setAlarmThreshold
(
alarmThreshold
);
jobInfo
.
setGlueSwitch
(
glueSwitch
);
jobInfo
.
setGlueSource
(
glueSource
);
jobInfo
.
setGlueRemark
(
glueRemark
);
jobInfo
.
setExecutorAddress
(
executorAddress
);
jobInfo
.
setExecutorHandler
(
executorHandler
);
jobInfo
.
setExecutorParam
(
executorParam
);
xxlJobInfoDao
.
save
(
jobInfo
);
try
{
// add job 2 quartz
boolean
result
=
DynamicSchedulerUtil
.
addJob
(
jobInfo
);
if
(
result
)
{
return
ReturnT
.
SUCCESS
;
}
else
{
xxlJobInfoDao
.
delete
(
jobGroup
,
jobName
);
return
new
ReturnT
<
String
>(
500
,
"新增任务失败"
);
}
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
ReturnT
.
FAIL
;
}
@Override
public
ReturnT
<
String
>
reschedule
(
String
jobGroup
,
String
jobName
,
String
jobCron
,
String
jobDesc
,
String
executorAddress
,
String
executorHandler
,
String
executorParam
,
String
author
,
String
alarmEmail
,
int
alarmThreshold
,
int
glueSwitch
)
{
// valid
if
(
JobGroupEnum
.
match
(
jobGroup
)
==
null
)
{
return
new
ReturnT
<
String
>(
500
,
"请选择“任务组”"
);
}
if
(
StringUtils
.
isBlank
(
jobName
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“任务名”"
);
}
if
(!
CronExpression
.
isValidExpression
(
jobCron
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入格式正确的“corn”"
);
}
if
(
StringUtils
.
isBlank
(
jobDesc
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“任务描述”"
);
}
if
(
StringUtils
.
isBlank
(
executorAddress
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“执行器地址”"
);
}
if
(
glueSwitch
==
0
&&
StringUtils
.
isBlank
(
executorHandler
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“jobHandler”"
);
}
if
(
StringUtils
.
isBlank
(
author
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“负责人”"
);
}
if
(
StringUtils
.
isBlank
(
alarmEmail
))
{
return
new
ReturnT
<
String
>(
500
,
"请输入“报警邮件”"
);
}
if
(
alarmThreshold
<
0
)
{
alarmThreshold
=
0
;
}
XxlJobInfo
jobInfo
=
xxlJobInfoDao
.
load
(
jobGroup
,
jobName
);
jobInfo
.
setJobCron
(
jobCron
);
jobInfo
.
setJobDesc
(
jobDesc
);
jobInfo
.
setAuthor
(
author
);
jobInfo
.
setAlarmEmail
(
alarmEmail
);
jobInfo
.
setAlarmThreshold
(
alarmThreshold
);
jobInfo
.
setGlueSwitch
(
glueSwitch
);
jobInfo
.
setExecutorAddress
(
executorAddress
);
jobInfo
.
setExecutorHandler
(
executorHandler
);
jobInfo
.
setExecutorParam
(
executorParam
);
try
{
// fresh quartz
DynamicSchedulerUtil
.
rescheduleJob
(
jobInfo
);
// fresh db
xxlJobInfoDao
.
update
(
jobInfo
);
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
ReturnT
.
FAIL
;
}
@Override
public
ReturnT
<
String
>
remove
(
String
jobGroup
,
String
jobName
)
{
try
{
DynamicSchedulerUtil
.
removeJob
(
jobName
,
jobGroup
);
xxlJobInfoDao
.
delete
(
jobGroup
,
jobName
);
xxlJobLogDao
.
delete
(
jobGroup
,
jobName
);
xxlJobLogGlueDao
.
delete
(
jobGroup
,
jobName
);
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
}
return
ReturnT
.
FAIL
;
}
@Override
public
ReturnT
<
String
>
pause
(
String
jobGroup
,
String
jobName
)
{
try
{
DynamicSchedulerUtil
.
pauseJob
(
jobName
,
jobGroup
);
// jobStatus do not store
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
return
ReturnT
.
FAIL
;
}
}
@Override
public
ReturnT
<
String
>
resume
(
String
jobGroup
,
String
jobName
)
{
try
{
DynamicSchedulerUtil
.
resumeJob
(
jobName
,
jobGroup
);
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
return
ReturnT
.
FAIL
;
}
}
@Override
public
ReturnT
<
String
>
triggerJob
(
String
jobGroup
,
String
jobName
)
{
try
{
DynamicSchedulerUtil
.
triggerJob
(
jobName
,
jobGroup
);
return
ReturnT
.
SUCCESS
;
}
catch
(
SchedulerException
e
)
{
e
.
printStackTrace
();
return
ReturnT
.
FAIL
;
}
}
}
xxl-job-admin/src/main/resources/applicationcontext-base.xml
浏览文件 @
71e12272
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd"
>
http://www.springframework.org/schema/util/spring-util.xsd"
>
<context:component-scan
base-package=
"com.xxl.job.admin.dao"
/>
<context:component-scan
base-package=
"com.xxl.job.admin.
service, com.xxl.job.admin.
dao"
/>
<bean
id=
"freemarkerConfig"
class=
"org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"
>
<bean
id=
"freemarkerConfig"
class=
"org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"
>
<property
name=
"templateLoaderPath"
value=
"/WEB-INF/template/"
/>
<property
name=
"templateLoaderPath"
value=
"/WEB-INF/template/"
/>
...
...
xxl-job-admin/src/main/resources/applicationcontext-database.xml
浏览文件 @
71e12272
...
@@ -48,7 +48,6 @@
...
@@ -48,7 +48,6 @@
</bean>
</bean>
<!-- part 2 :for tx -->
<!-- part 2 :for tx -->
<!--
<bean
id=
"transactionManager"
class=
"org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
<bean
id=
"transactionManager"
class=
"org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
<property
name=
"dataSource"
ref=
"dataSource"
/>
<property
name=
"dataSource"
ref=
"dataSource"
/>
</bean>
</bean>
...
@@ -68,9 +67,8 @@
...
@@ -68,9 +67,8 @@
</tx:advice>
</tx:advice>
<aop:config>
<aop:config>
<aop:pointcut id="txoperation" expression="execution(* com.xxl.job.admin.service.imp.*.*(..))" />
<aop:pointcut
id=
"txoperation"
expression=
"execution(* com.xxl.job.admin.service.imp
l
.*.*(..))"
/>
<aop:advisor
pointcut-ref=
"txoperation"
advice-ref=
"txAdvice"
/>
<aop:advisor
pointcut-ref=
"txoperation"
advice-ref=
"txAdvice"
/>
</aop:config>
</aop:config>
-->
</beans>
</beans>
\ No newline at end of file
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
浏览文件 @
71e12272
...
@@ -11,7 +11,6 @@
...
@@ -11,7 +11,6 @@
<result
column=
"job_cron"
property=
"jobCron"
/>
<result
column=
"job_cron"
property=
"jobCron"
/>
<result
column=
"job_desc"
property=
"jobDesc"
/>
<result
column=
"job_desc"
property=
"jobDesc"
/>
<result
column=
"job_class"
property=
"jobClass"
/>
<result
column=
"job_class"
property=
"jobClass"
/>
<result
column=
"job_data"
property=
"jobData"
/>
<result
column=
"add_time"
property=
"addTime"
/>
<result
column=
"add_time"
property=
"addTime"
/>
<result
column=
"update_time"
property=
"updateTime"
/>
<result
column=
"update_time"
property=
"updateTime"
/>
...
@@ -20,6 +19,10 @@
...
@@ -20,6 +19,10 @@
<result
column=
"alarm_email"
property=
"alarmEmail"
/>
<result
column=
"alarm_email"
property=
"alarmEmail"
/>
<result
column=
"alarm_threshold"
property=
"alarmThreshold"
/>
<result
column=
"alarm_threshold"
property=
"alarmThreshold"
/>
<result
column=
"executor_address"
property=
"executorAddress"
/>
<result
column=
"executor_handler"
property=
"executorHandler"
/>
<result
column=
"executor_param"
property=
"executorParam"
/>
<result
column=
"glue_switch"
property=
"glueSwitch"
/>
<result
column=
"glue_switch"
property=
"glueSwitch"
/>
<result
column=
"glue_source"
property=
"glueSource"
/>
<result
column=
"glue_source"
property=
"glueSource"
/>
<result
column=
"glue_remark"
property=
"glueRemark"
/>
<result
column=
"glue_remark"
property=
"glueRemark"
/>
...
@@ -32,12 +35,14 @@
...
@@ -32,12 +35,14 @@
t.job_cron,
t.job_cron,
t.job_desc,
t.job_desc,
t.job_class,
t.job_class,
t.job_data,
t.add_time,
t.add_time,
t.update_time,
t.update_time,
t.author,
t.author,
t.alarm_email,
t.alarm_email,
t.alarm_threshold,
t.alarm_threshold,
t.executor_address,
t.executor_handler,
t.executor_param,
t.glue_switch,
t.glue_switch,
t.glue_source,
t.glue_source,
t.glue_remark
t.glue_remark
...
@@ -78,12 +83,14 @@
...
@@ -78,12 +83,14 @@
job_cron,
job_cron,
job_desc,
job_desc,
job_class,
job_class,
job_data,
add_time,
add_time,
update_time,
update_time,
author,
author,
alarm_email,
alarm_email,
alarm_threshold,
alarm_threshold,
executor_address,
executor_handler,
executor_param,
glue_switch,
glue_switch,
glue_source,
glue_source,
glue_remark
glue_remark
...
@@ -93,12 +100,14 @@
...
@@ -93,12 +100,14 @@
#{jobCron},
#{jobCron},
#{jobDesc},
#{jobDesc},
#{jobClass},
#{jobClass},
#{jobData},
NOW(),
NOW(),
NOW(),
NOW(),
#{author},
#{author},
#{alarmEmail},
#{alarmEmail},
#{alarmThreshold},
#{alarmThreshold},
#{executorAddress},
#{executorHandler},
#{executorParam},
#{glueSwitch},
#{glueSwitch},
#{glueSource},
#{glueSource},
#{glueRemark}
#{glueRemark}
...
@@ -120,11 +129,13 @@
...
@@ -120,11 +129,13 @@
SET
SET
job_cron = #{jobCron},
job_cron = #{jobCron},
job_desc = #{jobDesc},
job_desc = #{jobDesc},
job_data = #{jobData},
update_time = NOW(),
update_time = NOW(),
author = #{author},
author = #{author},
alarm_email = #{alarmEmail},
alarm_email = #{alarmEmail},
alarm_threshold = #{alarmThreshold},
alarm_threshold = #{alarmThreshold},
executor_address = #{executorAddress},
executor_handler = #{executorHandler},
executor_param = #{executorParam},
glue_switch = #{glueSwitch},
glue_switch = #{glueSwitch},
glue_source = #{glueSource},
glue_source = #{glueSource},
glue_remark = #{glueRemark}
glue_remark = #{glueRemark}
...
...
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
浏览文件 @
71e12272
...
@@ -11,7 +11,10 @@
...
@@ -11,7 +11,10 @@
<result
column=
"job_cron"
property=
"jobCron"
/>
<result
column=
"job_cron"
property=
"jobCron"
/>
<result
column=
"job_desc"
property=
"jobDesc"
/>
<result
column=
"job_desc"
property=
"jobDesc"
/>
<result
column=
"job_class"
property=
"jobClass"
/>
<result
column=
"job_class"
property=
"jobClass"
/>
<result
column=
"job_data"
property=
"jobData"
/>
<result
column=
"executor_address"
property=
"executorAddress"
/>
<result
column=
"executor_handler"
property=
"executorHandler"
/>
<result
column=
"executor_param"
property=
"executorParam"
/>
<result
column=
"trigger_time"
property=
"triggerTime"
/>
<result
column=
"trigger_time"
property=
"triggerTime"
/>
<result
column=
"trigger_status"
property=
"triggerStatus"
/>
<result
column=
"trigger_status"
property=
"triggerStatus"
/>
...
@@ -20,6 +23,7 @@
...
@@ -20,6 +23,7 @@
<result
column=
"handle_time"
property=
"handleTime"
/>
<result
column=
"handle_time"
property=
"handleTime"
/>
<result
column=
"handle_status"
property=
"handleStatus"
/>
<result
column=
"handle_status"
property=
"handleStatus"
/>
<result
column=
"handle_msg"
property=
"handleMsg"
/>
<result
column=
"handle_msg"
property=
"handleMsg"
/>
</resultMap>
</resultMap>
<sql
id=
"Base_Column_List"
>
<sql
id=
"Base_Column_List"
>
...
@@ -29,7 +33,9 @@
...
@@ -29,7 +33,9 @@
t.job_cron,
t.job_cron,
t.job_desc,
t.job_desc,
t.job_class,
t.job_class,
t.job_data,
t.executor_address,
t.executor_handler,
t.executor_param,
t.trigger_time,
t.trigger_time,
t.trigger_status,
t.trigger_status,
t.trigger_msg,
t.trigger_msg,
...
@@ -98,14 +104,18 @@
...
@@ -98,14 +104,18 @@
`job_cron`,
`job_cron`,
`job_desc`,
`job_desc`,
`job_class`,
`job_class`,
`job_data`
`executor_address`,
`executor_handler`,
`executor_param`
) VALUES (
) VALUES (
#{jobGroup},
#{jobGroup},
#{jobName},
#{jobName},
#{jobCron},
#{jobCron},
#{jobDesc},
#{jobDesc},
#{jobClass},
#{jobClass},
#{jobData}
#{executorAddress},
#{executorHandler},
#{executorParam}
);
);
<selectKey
resultType=
"java.lang.Integer"
order=
"AFTER"
keyProperty=
"id"
>
<selectKey
resultType=
"java.lang.Integer"
order=
"AFTER"
keyProperty=
"id"
>
SELECT LAST_INSERT_ID()
SELECT LAST_INSERT_ID()
...
@@ -117,7 +127,10 @@
...
@@ -117,7 +127,10 @@
SET
SET
`trigger_time`= #{triggerTime},
`trigger_time`= #{triggerTime},
`trigger_status`= #{triggerStatus},
`trigger_status`= #{triggerStatus},
`trigger_msg`= #{triggerMsg}
`trigger_msg`= #{triggerMsg},
`executor_address`= #{executorAddress},
`executor_handler`= #{executorHandler},
`executor_param`= #{executorParam}
WHERE `id`= #{id}
WHERE `id`= #{id}
</update>
</update>
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl
浏览文件 @
71e12272
...
@@ -72,7 +72,9 @@
...
@@ -72,7 +72,9 @@
<th
name=
"jobDesc"
>
描述
</th>
<th
name=
"jobDesc"
>
描述
</th>
<th
name=
"jobCron"
>
Cron
</th>
<th
name=
"jobCron"
>
Cron
</th>
<th
name=
"jobClass"
>
JobBean
</th>
<th
name=
"jobClass"
>
JobBean
</th>
<th
name=
"jobData"
>
任务数据
</th>
<th
name=
"executorAddress"
>
执行器地址
</th>
<th
name=
"executorHandler"
>
JobHandler
</th>
<th
name=
"executorParam"
>
任务参数
</th>
<th
name=
"addTime"
>
新增时间
</th>
<th
name=
"addTime"
>
新增时间
</th>
<th
name=
"updateTime"
>
更新时间
</th>
<th
name=
"updateTime"
>
更新时间
</th>
<th
name=
"author"
>
负责人
</th>
<th
name=
"author"
>
负责人
</th>
...
@@ -126,13 +128,13 @@
...
@@ -126,13 +128,13 @@
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
执行器地址
<font
color=
"red"
>
*
</font></label>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
执行器地址
<font
color=
"red"
>
*
</font></label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
handler_address"
placeholder=
"请输入“执行器地址”
"
maxlength=
"200"
></div>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
executorAddress"
placeholder=
"请输入“执行器地址”,多个地址逗号分隔
"
maxlength=
"200"
></div>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
jobHandler
<font
color=
"red"
>
*
</font></label>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
jobHandler
<font
color=
"red"
>
*
</font></label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
handler_name
"
placeholder=
"请输入“jobHandler”"
maxlength=
"200"
></div>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
executorHandler
"
placeholder=
"请输入“jobHandler”"
maxlength=
"200"
></div>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"firstname"
class=
"col-sm-2 control-label"
>
执行参数
<font
color=
"black"
>
*
</font></label>
<label
for=
"firstname"
class=
"col-sm-2 control-label"
>
执行参数
<font
color=
"black"
>
*
</font></label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
handler_params
"
placeholder=
"请输入“执行参数”"
maxlength=
"100"
></div>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
executorParam
"
placeholder=
"请输入“执行参数”"
maxlength=
"100"
></div>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
负责人
<font
color=
"red"
>
*
</font></label>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
负责人
<font
color=
"red"
>
*
</font></label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"author"
placeholder=
"请输入“负责人”"
maxlength=
"200"
></div>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"author"
placeholder=
"请输入“负责人”"
maxlength=
"200"
></div>
</div>
</div>
...
@@ -207,13 +209,13 @@ public class DemoJobHandler extends IJobHandler {
...
@@ -207,13 +209,13 @@ public class DemoJobHandler extends IJobHandler {
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
执行器地址
<font
color=
"red"
>
*
</font></label>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
执行器地址
<font
color=
"red"
>
*
</font></label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
handler_address"
placeholder=
"请输入“执行器地址”
"
maxlength=
"200"
></div>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
executorAddress"
placeholder=
"请输入“执行器地址”,多个地址逗号分隔
"
maxlength=
"200"
></div>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
jobHandler
<font
color=
"red"
>
*
</font></label>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
jobHandler
<font
color=
"red"
>
*
</font></label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
handler_name
"
placeholder=
"请输入“jobHandler”"
maxlength=
"200"
></div>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
executorHandler
"
placeholder=
"请输入“jobHandler”"
maxlength=
"200"
></div>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<label
for=
"firstname"
class=
"col-sm-2 control-label"
>
执行参数
<font
color=
"black"
>
*
</font></label>
<label
for=
"firstname"
class=
"col-sm-2 control-label"
>
执行参数
<font
color=
"black"
>
*
</font></label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
handler_params
"
placeholder=
"请输入“执行参数”"
maxlength=
"100"
></div>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"
executorParam
"
placeholder=
"请输入“执行参数”"
maxlength=
"100"
></div>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
负责人
<font
color=
"red"
>
*
</font></label>
<label
for=
"lastname"
class=
"col-sm-2 control-label"
>
负责人
<font
color=
"red"
>
*
</font></label>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"author"
placeholder=
"请输入“负责人”"
maxlength=
"200"
></div>
<div
class=
"col-sm-4"
><input
type=
"text"
class=
"form-control"
name=
"author"
placeholder=
"请输入“负责人”"
maxlength=
"200"
></div>
</div>
</div>
...
...
xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/index.ftl
→
xxl-job-admin/src/main/webapp/WEB-INF/template/joblog/
joblog.
index.ftl
浏览文件 @
71e12272
...
@@ -78,7 +78,9 @@
...
@@ -78,7 +78,9 @@
<th
name=
"jobCron"
>
Cron
</th>
<th
name=
"jobCron"
>
Cron
</th>
<th
name=
"jobDesc"
>
描述
</th>
<th
name=
"jobDesc"
>
描述
</th>
<th
name=
"jobClass"
>
JobBean
</th>
<th
name=
"jobClass"
>
JobBean
</th>
<th
name=
"jobData"
>
任务数据
</th>
<th
name=
"executorAddress"
>
执行器地址
</th>
<th
name=
"executorHandler"
>
JobHandler
</th>
<th
name=
"executorParam"
>
任务参数
</th>
<th
name=
"triggerTime"
>
调度时间
</th>
<th
name=
"triggerTime"
>
调度时间
</th>
<th
name=
"triggerStatus"
>
调度结果
</th>
<th
name=
"triggerStatus"
>
调度结果
</th>
<th
name=
"triggerMsg"
>
调度日志
</th>
<th
name=
"triggerMsg"
>
调度日志
</th>
...
...
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js
浏览文件 @
71e12272
...
@@ -33,17 +33,9 @@ $(function() {
...
@@ -33,17 +33,9 @@ $(function() {
{
"data"
:
'jobDesc'
,
"visible"
:
true
},
{
"data"
:
'jobDesc'
,
"visible"
:
true
},
{
"data"
:
'jobCron'
,
"visible"
:
true
},
{
"data"
:
'jobCron'
,
"visible"
:
true
},
{
"data"
:
'jobClass'
,
"visible"
:
false
},
{
"data"
:
'jobClass'
,
"visible"
:
false
},
{
{
"data"
:
'executorAddress'
,
"visible"
:
false
},
"data"
:
'jobData'
,
{
"data"
:
'executorHandler'
,
"visible"
:
false
},
"visible"
:
true
,
{
"data"
:
'executorParam'
,
"visible"
:
false
},
"render"
:
function
(
data
,
type
,
row
)
{
var
_jobData
=
eval
(
'('
+
data
+
')'
);
// row.jobData
var
html
=
"<p title='"
+
data
+
"'>执行器:"
+
_jobData
.
handler_name
+
"<br>执行参数:"
+
_jobData
.
handler_params
+
"<br>执行器地址:"
+
_jobData
.
handler_address
+
"</p>"
;
return
html
;
}
},
{
{
"data"
:
'addTime'
,
"data"
:
'addTime'
,
"visible"
:
false
,
"visible"
:
false
,
...
@@ -90,15 +82,12 @@ $(function() {
...
@@ -90,15 +82,12 @@ $(function() {
var
logUrl
=
base_url
+
'/joblog?jobGroup='
+
row
.
jobGroup
+
'&jobName='
+
row
.
jobName
;
var
logUrl
=
base_url
+
'/joblog?jobGroup='
+
row
.
jobGroup
+
'&jobName='
+
row
.
jobName
;
// log url
// log url
var
code
Html
=
""
;
var
code
Btn
=
""
;
if
(
row
.
glueSwitch
!=
0
){
if
(
row
.
glueSwitch
>
0
){
var
codeUrl
=
base_url
+
'/jobcode?jobGroup='
+
row
.
jobGroup
+
'&jobName='
+
row
.
jobName
;
var
codeUrl
=
base_url
+
'/jobcode?jobGroup='
+
row
.
jobGroup
+
'&jobName='
+
row
.
jobName
;
code
Html
=
'<button class="btn btn-warning btn-xs" type="button" onclick="javascript:window.open(
\'
'
+
codeUrl
+
'
\'
)" >GLUE</button> '
code
Btn
=
'<button class="btn btn-warning btn-xs" type="button" onclick="javascript:window.open(
\'
'
+
codeUrl
+
'
\'
)" >GLUE</button> '
}
}
// job data
var
jobDataMap
=
eval
(
'('
+
row
.
jobData
+
')'
);
var
html
=
'<p id="'
+
row
.
id
+
'" '
+
var
html
=
'<p id="'
+
row
.
id
+
'" '
+
' jobGroup="'
+
row
.
jobGroup
+
'" '
+
' jobGroup="'
+
row
.
jobGroup
+
'" '
+
' jobName="'
+
row
.
jobName
+
'" '
+
' jobName="'
+
row
.
jobName
+
'" '
+
...
@@ -106,9 +95,9 @@ $(function() {
...
@@ -106,9 +95,9 @@ $(function() {
' jobDesc="'
+
row
.
jobDesc
+
'" '
+
' jobDesc="'
+
row
.
jobDesc
+
'" '
+
' jobClass="'
+
row
.
jobClass
+
'" '
+
' jobClass="'
+
row
.
jobClass
+
'" '
+
' jobData="'
+
row
.
jobData
+
'" '
+
' jobData="'
+
row
.
jobData
+
'" '
+
'
handler_params="'
+
jobDataMap
.
handler_param
s
+
'" '
+
'
executorAddress="'
+
row
.
executorAddres
s
+
'" '
+
'
handler_address="'
+
jobDataMap
.
handler_address
+
'" '
+
'
executorHandler="'
+
row
.
executorHandler
+
'" '
+
'
handler_name="'
+
jobDataMap
.
handler_name
+
'" '
+
'
executorParam="'
+
row
.
executorParam
+
'" '
+
' author="'
+
row
.
author
+
'" '
+
' author="'
+
row
.
author
+
'" '
+
' alarmEmail="'
+
row
.
alarmEmail
+
'" '
+
' alarmEmail="'
+
row
.
alarmEmail
+
'" '
+
' alarmThreshold="'
+
row
.
alarmThreshold
+
'" '
+
' alarmThreshold="'
+
row
.
alarmThreshold
+
'" '
+
...
@@ -118,7 +107,7 @@ $(function() {
...
@@ -118,7 +107,7 @@ $(function() {
pause_resume
+
pause_resume
+
'<button class="btn btn-primary btn-xs" type="job_del" type="button" onclick="javascript:window.open(
\'
'
+
logUrl
+
'
\'
)" >日志</button><br> '
+
'<button class="btn btn-primary btn-xs" type="job_del" type="button" onclick="javascript:window.open(
\'
'
+
logUrl
+
'
\'
)" >日志</button><br> '
+
'<button class="btn btn-warning btn-xs update" type="button">编辑</button> '
+
'<button class="btn btn-warning btn-xs update" type="button">编辑</button> '
+
code
Html
+
code
Btn
+
'<button class="btn btn-danger btn-xs job_operate" type="job_del" type="button">删除</button> '
+
'<button class="btn btn-danger btn-xs job_operate" type="job_del" type="button">删除</button> '
+
'</p>'
;
'</p>'
;
...
@@ -236,11 +225,11 @@ $(function() {
...
@@ -236,11 +225,11 @@ $(function() {
required
:
true
,
required
:
true
,
maxlength
:
200
maxlength
:
200
},
},
handler_a
ddress
:
{
executorA
ddress
:
{
required
:
true
,
required
:
true
,
maxlength
:
200
maxlength
:
200
},
},
handler_name
:
{
executorHandler
:
{
required
:
true
,
required
:
true
,
maxlength
:
200
maxlength
:
200
},
},
...
@@ -271,11 +260,11 @@ $(function() {
...
@@ -271,11 +260,11 @@ $(function() {
required
:
"请输入“任务描述”."
,
required
:
"请输入“任务描述”."
,
maxlength
:
"“任务描述”长度不应超过200位"
maxlength
:
"“任务描述”长度不应超过200位"
},
},
handler_a
ddress
:
{
executorA
ddress
:
{
required
:
"请输入“执行器地址”."
,
required
:
"请输入“执行器地址”."
,
maxlength
:
"“执行器地址”长度不应超过200位"
maxlength
:
"“执行器地址”长度不应超过200位"
},
},
handler_name
:
{
executorHandler
:
{
required
:
"请输入“jobHandler”."
,
required
:
"请输入“jobHandler”."
,
maxlength
:
"“jobHandler”长度不应超过200位"
maxlength
:
"“jobHandler”长度不应超过200位"
},
},
...
@@ -359,9 +348,9 @@ $(function() {
...
@@ -359,9 +348,9 @@ $(function() {
$
(
"#updateModal .form input[name='jobName']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"jobName"
));
$
(
"#updateModal .form input[name='jobName']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"jobName"
));
$
(
"#updateModal .form input[name='jobCron']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"jobCron"
));
$
(
"#updateModal .form input[name='jobCron']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"jobCron"
));
$
(
"#updateModal .form input[name='jobDesc']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"jobDesc"
));
$
(
"#updateModal .form input[name='jobDesc']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"jobDesc"
));
$
(
"#updateModal .form input[name='
handler_address']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"handler_a
ddress"
));
$
(
"#updateModal .form input[name='
executorAddress']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"executorA
ddress"
));
$
(
"#updateModal .form input[name='
handler_name']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"handler_name
"
));
$
(
"#updateModal .form input[name='
executorHandler']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"executorHandler
"
));
$
(
"#updateModal .form input[name='
handler_params']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"handler_params
"
));
$
(
"#updateModal .form input[name='
executorParam']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"executorParam
"
));
$
(
"#updateModal .form input[name='author']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"author"
));
$
(
"#updateModal .form input[name='author']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"author"
));
$
(
"#updateModal .form input[name='alarmEmail']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"alarmEmail"
));
$
(
"#updateModal .form input[name='alarmEmail']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"alarmEmail"
));
$
(
"#updateModal .form input[name='alarmThreshold']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"alarmThreshold"
));
$
(
"#updateModal .form input[name='alarmThreshold']"
).
val
(
$
(
this
).
parent
(
'p'
).
attr
(
"alarmThreshold"
));
...
@@ -393,11 +382,11 @@ $(function() {
...
@@ -393,11 +382,11 @@ $(function() {
required
:
true
,
required
:
true
,
maxlength
:
200
maxlength
:
200
},
},
handler_a
ddress
:
{
executorA
ddress
:
{
required
:
true
,
required
:
true
,
maxlength
:
200
maxlength
:
200
},
},
handler_name
:
{
executorHandler
:
{
required
:
true
,
required
:
true
,
maxlength
:
200
maxlength
:
200
},
},
...
@@ -423,11 +412,11 @@ $(function() {
...
@@ -423,11 +412,11 @@ $(function() {
required
:
"请输入“任务描述”."
,
required
:
"请输入“任务描述”."
,
maxlength
:
"“任务描述”长度不应超过200位"
maxlength
:
"“任务描述”长度不应超过200位"
},
},
handler_a
ddress
:
{
executorA
ddress
:
{
required
:
"请输入“执行器地址”."
,
required
:
"请输入“执行器地址”."
,
maxlength
:
"“执行器地址”长度不应超过200位"
maxlength
:
"“执行器地址”长度不应超过200位"
},
},
handler_name
:
{
executorHandler
:
{
required
:
"请输入“jobHandler”."
,
required
:
"请输入“jobHandler”."
,
maxlength
:
"“jobHandler”长度不应超过200位"
maxlength
:
"“jobHandler”长度不应超过200位"
},
},
...
...
xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js
浏览文件 @
71e12272
...
@@ -60,22 +60,14 @@ $(function() {
...
@@ -60,22 +60,14 @@ $(function() {
return
data
;
return
data
;
}
}
},
},
{
"data"
:
'jobName'
},
{
"data"
:
'jobName'
,
"visible"
:
false
},
{
"data"
:
'jobCron'
,
"visible"
:
false
},
{
"data"
:
'jobCron'
,
"visible"
:
false
},
{
"data"
:
'jobDesc'
,
"visible"
:
false
},
{
"data"
:
'jobDesc'
,
"visible"
:
false
},
{
"data"
:
'jobClass'
,
"visible"
:
false
},
{
"data"
:
'jobClass'
,
"visible"
:
false
},
{
"data"
:
'jobData'
,
"visible"
:
true
,
"render"
:
function
(
data
,
type
,
row
)
{
var
_jobData
=
eval
(
'('
+
data
+
')'
);
// row.jobData
var
html
=
"<p title='"
+
data
+
"'>JobHandler:"
+
_jobData
.
handler_name
+
"<br>执行参数:"
+
_jobData
.
handler_params
+
"<br>执行器地址:"
+
_jobData
.
handler_address
+
"</p>"
;
return
data
?
'<a class="logMsg" href="javascript:;" >查看<span style="display:none;">'
+
html
+
'</span></a>'
:
"无"
;
{
"data"
:
'executorAddress'
,
"visible"
:
true
},
}
{
"data"
:
'executorHandler'
,
"visible"
:
true
},
},
{
"data"
:
'executorParam'
,
"visible"
:
true
},
{
{
"data"
:
'triggerTime'
,
"data"
:
'triggerTime'
,
"render"
:
function
(
data
,
type
,
row
)
{
"render"
:
function
(
data
,
type
,
row
)
{
...
@@ -106,12 +98,6 @@ $(function() {
...
@@ -106,12 +98,6 @@ $(function() {
"render"
:
function
(
data
,
type
,
row
)
{
"render"
:
function
(
data
,
type
,
row
)
{
// better support expression or string, not function
// better support expression or string, not function
return
function
()
{
return
function
()
{
// local job do not support trigger detail log, now
var
_jobData
=
eval
(
'('
+
row
.
jobData
+
')'
);
if
(
!
_jobData
.
handler_address
)
{
return
;
}
if
(
row
.
triggerStatus
==
'SUCCESS'
){
if
(
row
.
triggerStatus
==
'SUCCESS'
){
var
temp
=
'<a href="javascript:;" class="logDetail" _id="'
+
row
.
id
+
'">执行日志</a>'
;
var
temp
=
'<a href="javascript:;" class="logDetail" _id="'
+
row
.
id
+
'">执行日志</a>'
;
if
(
!
row
.
handleStatus
){
if
(
!
row
.
handleStatus
){
...
...
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobInfoTest.java
浏览文件 @
71e12272
...
@@ -34,7 +34,6 @@ public class XxlJobInfoTest {
...
@@ -34,7 +34,6 @@ public class XxlJobInfoTest {
info
.
setJobName
(
"job_name"
);
info
.
setJobName
(
"job_name"
);
info
.
setJobCron
(
"jobCron"
);
info
.
setJobCron
(
"jobCron"
);
info
.
setJobClass
(
"jobClass"
);
info
.
setJobClass
(
"jobClass"
);
info
.
setJobData
(
"jobData"
);
int
count
=
xxlJobInfoDao
.
save
(
info
);
int
count
=
xxlJobInfoDao
.
save
(
info
);
System
.
out
.
println
(
count
);
System
.
out
.
println
(
count
);
System
.
out
.
println
(
info
.
getId
());
System
.
out
.
println
(
info
.
getId
());
...
@@ -48,7 +47,6 @@ public class XxlJobInfoTest {
...
@@ -48,7 +47,6 @@ public class XxlJobInfoTest {
XxlJobInfo
item
=
xxlJobInfoDao
.
load
(
null
,
"job_name"
);
XxlJobInfo
item
=
xxlJobInfoDao
.
load
(
null
,
"job_name"
);
item
.
setJobCron
(
"jobCron2"
);
item
.
setJobCron
(
"jobCron2"
);
item
.
setJobData
(
"jobData2"
);
xxlJobInfoDao
.
update
(
item
);
xxlJobInfoDao
.
update
(
item
);
}
}
...
...
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogTest.java
浏览文件 @
71e12272
...
@@ -28,7 +28,6 @@ public class XxlJobLogTest {
...
@@ -28,7 +28,6 @@ public class XxlJobLogTest {
xxlJobLog
.
setJobName
(
"job_name"
);
xxlJobLog
.
setJobName
(
"job_name"
);
xxlJobLog
.
setJobCron
(
"jobCron"
);
xxlJobLog
.
setJobCron
(
"jobCron"
);
xxlJobLog
.
setJobClass
(
"jobClass"
);
xxlJobLog
.
setJobClass
(
"jobClass"
);
xxlJobLog
.
setJobData
(
"jobData"
);
int
count
=
xxlJobLogDao
.
save
(
xxlJobLog
);
int
count
=
xxlJobLogDao
.
save
(
xxlJobLog
);
System
.
out
.
println
(
count
);
System
.
out
.
println
(
count
);
System
.
out
.
println
(
xxlJobLog
.
getId
());
System
.
out
.
println
(
xxlJobLog
.
getId
());
...
...
xxl-job-core/src/main/java/com/xxl/job/core/handler/HandlerRepository.java
浏览文件 @
71e12272
...
@@ -19,20 +19,49 @@ import com.xxl.job.core.util.JacksonUtil;
...
@@ -19,20 +19,49 @@ import com.xxl.job.core.util.JacksonUtil;
public
class
HandlerRepository
{
public
class
HandlerRepository
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
HandlerRepository
.
class
);
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
HandlerRepository
.
class
);
public
static
final
String
NAMESPACE
=
"namespace"
;
public
enum
HandlerParamEnum
{
public
enum
NameSpaceEnum
{
RUN
,
KILL
,
LOG
}
/**
* trigger timestamp
public
static
final
String
HANDLER_ADDRESS
=
"handler_address"
;
*/
public
static
final
String
HANDLER_PARAMS
=
"handler_params"
;
TIMESTAMP
,
/**
public
static
final
String
HANDLER_GLUE_SWITCH
=
"handler_glue_switch"
;
* trigger action
public
static
final
String
HANDLER_NAME
=
"handler_name"
;
*/
public
static
final
String
HANDLER_JOB_GROUP
=
"handler_job_group"
;
ACTION
,
public
static
final
String
HANDLER_JOB_NAME
=
"handler_job_name"
;
/**
* remote executor jobhandler
public
static
final
String
TRIGGER_LOG_ID
=
"trigger_log_id"
;
*/
public
static
final
String
TRIGGER_LOG_ADDRESS
=
"trigger_log_address"
;
EXECUTOR_HANDLER
,
public
static
final
String
TRIGGER_TIMESTAMP
=
"trigger_timestamp"
;
/**
* params of jobhandler
*/
EXECUTOR_PARAMS
,
/**
* switch of job, if open glue model
*/
GLUE_SWITCH
,
/**
* job group
*/
JOB_GROUP
,
/**
* job name
*/
JOB_NAME
,
/**
* address for callback log
*/
LOG_ADDRESS
,
/**
* log id
*/
LOG_ID
,
/**
* log date
*/
LOG_DATE
}
public
enum
ActionEnum
{
RUN
,
KILL
,
LOG
,
BEAT
}
public
static
ConcurrentHashMap
<
String
,
HandlerThread
>
handlerTreadMap
=
new
ConcurrentHashMap
<
String
,
HandlerThread
>();
public
static
ConcurrentHashMap
<
String
,
HandlerThread
>
handlerTreadMap
=
new
ConcurrentHashMap
<
String
,
HandlerThread
>();
...
@@ -53,27 +82,26 @@ public class HandlerRepository {
...
@@ -53,27 +82,26 @@ public class HandlerRepository {
callback
.
setStatus
(
RemoteCallBack
.
FAIL
);
callback
.
setStatus
(
RemoteCallBack
.
FAIL
);
// check namespace
// check namespace
String
namespace
=
_param
.
get
(
Handler
Repository
.
NAMESPACE
);
String
namespace
=
_param
.
get
(
Handler
ParamEnum
.
ACTION
.
name
()
);
if
(
namespace
==
null
||
namespace
.
trim
().
length
()==
0
)
{
if
(
namespace
==
null
||
namespace
.
trim
().
length
()==
0
)
{
callback
.
setMsg
(
"param[NAMESPACE] can not be null."
);
callback
.
setMsg
(
"param[NAMESPACE] can not be null."
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
}
}
// parse namespace
if
(
namespace
.
equals
(
HandlerRepository
.
NameSpaceEnum
.
RUN
.
name
()))
{
// encryption check
// encryption check
long
timestamp
=
_param
.
get
(
HandlerRepository
.
TRIGGER_TIMESTAMP
)!=
null
?
Long
.
valueOf
(
_param
.
get
(
HandlerRepository
.
TRIGGER_TIMESTAMP
)):-
1
;
long
timestamp
=
_param
.
get
(
HandlerParamEnum
.
TIMESTAMP
.
name
())!=
null
?
Long
.
valueOf
(
_param
.
get
(
HandlerParamEnum
.
TIMESTAMP
.
name
()
)):-
1
;
if
(
System
.
currentTimeMillis
()
-
timestamp
>
60000
)
{
if
(
System
.
currentTimeMillis
()
-
timestamp
>
60000
)
{
callback
.
setMsg
(
"Timestamp check failed."
);
callback
.
setMsg
(
"Timestamp check failed."
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
}
}
// parse namespace
if
(
namespace
.
equals
(
ActionEnum
.
RUN
.
name
()))
{
// push data to queue
// push data to queue
String
handler_glue_switch
=
_param
.
get
(
Handler
Repository
.
HANDLER_GLUE_SWITCH
);
String
handler_glue_switch
=
_param
.
get
(
Handler
ParamEnum
.
GLUE_SWITCH
.
name
()
);
HandlerThread
handlerThread
=
null
;
HandlerThread
handlerThread
=
null
;
if
(
"0"
.
equals
(
handler_glue_switch
))
{
if
(
"0"
.
equals
(
handler_glue_switch
))
{
// bean model
// bean model
String
handler_name
=
_param
.
get
(
Handler
Repository
.
HANDLER_NAME
);
String
handler_name
=
_param
.
get
(
Handler
ParamEnum
.
EXECUTOR_HANDLER
.
name
()
);
if
(
handler_name
==
null
||
handler_name
.
trim
().
length
()==
0
)
{
if
(
handler_name
==
null
||
handler_name
.
trim
().
length
()==
0
)
{
callback
.
setMsg
(
"bean model handler[HANDLER_NAME] not found."
);
callback
.
setMsg
(
"bean model handler[HANDLER_NAME] not found."
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
...
@@ -85,70 +113,81 @@ public class HandlerRepository {
...
@@ -85,70 +113,81 @@ public class HandlerRepository {
}
}
}
else
{
}
else
{
// glue
// glue
String
handler_job_group
=
_param
.
get
(
HandlerRepository
.
HANDLER_JOB_GROUP
);
String
job_group
=
_param
.
get
(
HandlerParamEnum
.
JOB_GROUP
.
name
()
);
String
handler_job_name
=
_param
.
get
(
HandlerRepository
.
HANDLER_JOB_NAME
);
String
job_name
=
_param
.
get
(
HandlerParamEnum
.
JOB_NAME
.
name
()
);
if
(
handler_job_group
==
null
||
handler_job_group
.
trim
().
length
()==
0
||
handler_job_name
==
null
||
handler_
job_name
.
trim
().
length
()==
0
)
{
if
(
job_group
==
null
||
job_group
.
trim
().
length
()==
0
||
job_name
==
null
||
job_name
.
trim
().
length
()==
0
)
{
callback
.
setMsg
(
"glue model handler[job group or name] is null."
);
callback
.
setMsg
(
"glue model handler[job group or name] is null."
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
}
}
String
glueHandleName
=
"glue_"
.
concat
(
handler_job_group
).
concat
(
"_"
).
concat
(
handler_
job_name
);
String
glueHandleName
=
"glue_"
.
concat
(
job_group
).
concat
(
"_"
).
concat
(
job_name
);
handlerThread
=
handlerTreadMap
.
get
(
glueHandleName
);
handlerThread
=
handlerTreadMap
.
get
(
glueHandleName
);
if
(
handlerThread
==
null
)
{
if
(
handlerThread
==
null
)
{
HandlerRepository
.
regist
(
glueHandleName
,
new
GlueJobHandler
(
handler_job_group
,
handler_
job_name
));
HandlerRepository
.
regist
(
glueHandleName
,
new
GlueJobHandler
(
job_group
,
job_name
));
}
}
handlerThread
=
handlerTreadMap
.
get
(
glueHandleName
);
handlerThread
=
handlerTreadMap
.
get
(
glueHandleName
);
}
}
handlerThread
.
pushData
(
_param
);
handlerThread
.
pushData
(
_param
);
callback
.
setStatus
(
RemoteCallBack
.
SUCCESS
);
callback
.
setStatus
(
RemoteCallBack
.
SUCCESS
);
}
else
if
(
namespace
.
equals
(
HandlerRepository
.
NameSpace
Enum
.
LOG
.
name
()))
{
}
else
if
(
namespace
.
equals
(
Action
Enum
.
LOG
.
name
()))
{
String
trigger_log_id
=
_param
.
get
(
HandlerRepository
.
TRIGGER_LOG_ID
);
String
log_id
=
_param
.
get
(
HandlerParamEnum
.
LOG_ID
.
name
()
);
String
trigger_timestamp
=
_param
.
get
(
HandlerRepository
.
TRIGGER_TIMESTAMP
);
String
log_date
=
_param
.
get
(
HandlerParamEnum
.
LOG_DATE
.
name
()
);
if
(
trigger_log_id
==
null
||
trigger_timestamp
==
null
)
{
if
(
log_id
==
null
||
log_date
==
null
)
{
callback
.
setMsg
(
"
trigger_log_id | trigger_timestamp
can not be null."
);
callback
.
setMsg
(
"
LOG_ID | LOG_DATE
can not be null."
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
}
}
int
logId
=
-
1
;
int
logId
=
-
1
;
Date
triggerDate
=
null
;
Date
triggerDate
=
null
;
try
{
try
{
logId
=
Integer
.
valueOf
(
trigger_
log_id
);
logId
=
Integer
.
valueOf
(
log_id
);
triggerDate
=
new
Date
(
Long
.
valueOf
(
trigger_timestamp
));
triggerDate
=
new
Date
(
Long
.
valueOf
(
log_date
));
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
}
}
if
(
logId
<=
0
||
triggerDate
==
null
)
{
if
(
logId
<=
0
||
triggerDate
==
null
)
{
callback
.
setMsg
(
"
trigger_log_id | trigger_timestamp is not parsed valid
."
);
callback
.
setMsg
(
"
LOG_ID | LOG_DATE parse error
."
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
}
}
String
logConteng
=
XxlJobFileAppender
.
readLog
(
triggerDate
,
trigger_
log_id
);
String
logConteng
=
XxlJobFileAppender
.
readLog
(
triggerDate
,
log_id
);
callback
.
setStatus
(
RemoteCallBack
.
SUCCESS
);
callback
.
setStatus
(
RemoteCallBack
.
SUCCESS
);
callback
.
setMsg
(
logConteng
);
callback
.
setMsg
(
logConteng
);
}
else
if
(
namespace
.
equals
(
HandlerRepository
.
NameSpaceEnum
.
KILL
.
name
()))
{
}
else
if
(
namespace
.
equals
(
ActionEnum
.
KILL
.
name
()))
{
// encryption check
// kill handlerThread, and create new one
long
timestamp
=
_param
.
get
(
HandlerRepository
.
TRIGGER_TIMESTAMP
)!=
null
?
Long
.
valueOf
(
_param
.
get
(
HandlerRepository
.
TRIGGER_TIMESTAMP
)):-
1
;
String
handler_glue_switch
=
_param
.
get
(
HandlerParamEnum
.
GLUE_SWITCH
.
name
());
if
(
System
.
currentTimeMillis
()
-
timestamp
>
60000
)
{
String
handlerName
=
null
;
callback
.
setMsg
(
"Timestamp check failed."
);
if
(
"0"
.
equals
(
handler_glue_switch
))
{
String
executor_handler
=
_param
.
get
(
HandlerParamEnum
.
EXECUTOR_HANDLER
.
name
());
if
(
executor_handler
==
null
)
{
callback
.
setMsg
(
"bean job , param[EXECUTOR_HANDLER] is null"
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
}
}
handlerName
=
executor_handler
;
}
else
{
// glue
String
job_group
=
_param
.
get
(
HandlerParamEnum
.
JOB_GROUP
.
name
());
String
job_name
=
_param
.
get
(
HandlerParamEnum
.
JOB_NAME
.
name
());
if
(
job_group
==
null
||
job_group
.
trim
().
length
()==
0
||
job_name
==
null
||
job_name
.
trim
().
length
()==
0
)
{
callback
.
setMsg
(
"glue job , param[JOB_GROUP or JOB_NAME] is null"
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
}
handlerName
=
"glue_"
.
concat
(
job_group
).
concat
(
"_"
).
concat
(
job_name
);
}
// kill handlerThread, and create new one
HandlerThread
handlerThread
=
handlerTreadMap
.
get
(
handlerName
);
String
handler_name
=
_param
.
get
(
HandlerRepository
.
HANDLER_NAME
);
if
(
handler_name
!=
null
&&
handler_name
.
trim
().
length
()>
0
)
{
HandlerThread
handlerThread
=
handlerTreadMap
.
get
(
handler_name
);
if
(
handlerThread
!=
null
)
{
if
(
handlerThread
!=
null
)
{
IJobHandler
handler
=
handlerThread
.
getHandler
();
IJobHandler
handler
=
handlerThread
.
getHandler
();
handlerThread
.
toStop
();
handlerThread
.
toStop
();
handlerThread
.
interrupt
();
handlerThread
.
interrupt
();
regist
(
handler_n
ame
,
handler
);
regist
(
handlerN
ame
,
handler
);
callback
.
setStatus
(
RemoteCallBack
.
SUCCESS
);
callback
.
setStatus
(
RemoteCallBack
.
SUCCESS
);
}
else
{
}
else
{
callback
.
setMsg
(
"handler["
+
handler_name
+
"] not found."
);
callback
.
setMsg
(
"job handler["
+
handlerName
+
"] not found."
);
}
}
else
{
callback
.
setMsg
(
"param[HANDLER_NAME] can not be null."
);
}
}
}
else
if
(
namespace
.
equals
(
ActionEnum
.
BEAT
.
name
()))
{
callback
.
setStatus
(
RemoteCallBack
.
SUCCESS
);
callback
.
setMsg
(
null
);
}
else
{
}
else
{
callback
.
setMsg
(
"param[
NAMESPACE
] is not valid."
);
callback
.
setMsg
(
"param[
Action
] is not valid."
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
return
JacksonUtil
.
writeValueAsString
(
callback
);
}
}
...
...
xxl-job-core/src/main/java/com/xxl/job/core/handler/HandlerThread.java
浏览文件 @
71e12272
...
@@ -11,6 +11,7 @@ import org.eclipse.jetty.util.ConcurrentHashSet;
...
@@ -11,6 +11,7 @@ import org.eclipse.jetty.util.ConcurrentHashSet;
import
org.slf4j.Logger
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.slf4j.LoggerFactory
;
import
com.xxl.job.core.handler.HandlerRepository.HandlerParamEnum
;
import
com.xxl.job.core.handler.IJobHandler.JobHandleStatus
;
import
com.xxl.job.core.handler.IJobHandler.JobHandleStatus
;
import
com.xxl.job.core.log.XxlJobFileAppender
;
import
com.xxl.job.core.log.XxlJobFileAppender
;
import
com.xxl.job.core.util.HttpUtil
;
import
com.xxl.job.core.util.HttpUtil
;
...
@@ -47,7 +48,7 @@ public class HandlerThread extends Thread{
...
@@ -47,7 +48,7 @@ public class HandlerThread extends Thread{
}
}
public
void
pushData
(
Map
<
String
,
String
>
param
)
{
public
void
pushData
(
Map
<
String
,
String
>
param
)
{
if
(
param
.
get
(
Handler
Repository
.
TRIGGER_LOG_ID
)!=
null
&&
!
logIdSet
.
contains
(
param
.
get
(
HandlerRepository
.
TRIGGER_LOG_ID
)))
{
if
(
param
.
get
(
Handler
ParamEnum
.
LOG_ID
.
name
())!=
null
&&
!
logIdSet
.
contains
(
param
.
get
(
HandlerParamEnum
.
LOG_ID
.
name
()
)))
{
handlerDataQueue
.
offer
(
param
);
handlerDataQueue
.
offer
(
param
);
}
}
}
}
...
@@ -60,9 +61,9 @@ public class HandlerThread extends Thread{
...
@@ -60,9 +61,9 @@ public class HandlerThread extends Thread{
Map
<
String
,
String
>
handlerData
=
handlerDataQueue
.
poll
();
Map
<
String
,
String
>
handlerData
=
handlerDataQueue
.
poll
();
if
(
handlerData
!=
null
)
{
if
(
handlerData
!=
null
)
{
i
=
0
;
i
=
0
;
String
trigger_log_address
=
handlerData
.
get
(
Handler
Repository
.
TRIGGER_LOG_ADDRESS
);
String
trigger_log_address
=
handlerData
.
get
(
Handler
ParamEnum
.
LOG_ADDRESS
.
name
()
);
String
trigger_log_id
=
handlerData
.
get
(
Handler
Repository
.
TRIGGER_LOG_ID
);
String
trigger_log_id
=
handlerData
.
get
(
Handler
ParamEnum
.
LOG_ID
.
name
()
);
String
handler_params
=
handlerData
.
get
(
Handler
Repository
.
HANDLER_PARAMS
);
String
handler_params
=
handlerData
.
get
(
Handler
ParamEnum
.
EXECUTOR_PARAMS
.
name
()
);
logIdSet
.
remove
(
trigger_log_id
);
logIdSet
.
remove
(
trigger_log_id
);
// parse param
// parse param
...
...
xxl-job-core/src/main/java/com/xxl/job/core/util/HttpUtil.java
浏览文件 @
71e12272
package
com
.
xxl
.
job
.
core
.
util
;
package
com
.
xxl
.
job
.
core
.
util
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
import
java.io.StringWriter
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
...
@@ -98,9 +96,10 @@ public class HttpUtil {
...
@@ -98,9 +96,10 @@ public class HttpUtil {
}
}
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
e
.
printStackTrace
();
StringWriter
out
=
new
StringWriter
();
/*
StringWriter out = new StringWriter();
e.printStackTrace(new PrintWriter(out));
e.printStackTrace(new PrintWriter(out));
callback
.
setMsg
(
out
.
toString
());
callback.setMsg(out.toString());*/
callback
.
setMsg
(
e
.
getMessage
());
}
finally
{
}
finally
{
if
(
httpPost
!=
null
)
{
if
(
httpPost
!=
null
)
{
httpPost
.
releaseConnection
();
httpPost
.
releaseConnection
();
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论