Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
ed31b1b6
提交
ed31b1b6
authored
10月 11, 2017
作者:
xuxueli
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修复任务监控线程被耗时任务阻塞的问题
上级
16509882
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
19 行增加
和
12 行删除
+19
-12
XXL-JOB官方文档.md
doc/XXL-JOB官方文档.md
+2
-1
JobFailMonitorHelper.java
...a/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
+17
-11
没有找到文件。
doc/XXL-JOB官方文档.md
浏览文件 @
ed31b1b6
...
@@ -571,7 +571,7 @@ XXL-JOB首先定制了Quartz原生表结构前缀(XXL_JOB_QRTZ_)。
...
@@ -571,7 +571,7 @@ XXL-JOB首先定制了Quartz原生表结构前缀(XXL_JOB_QRTZ_)。
#### 5.3.2 系统组成
#### 5.3.2 系统组成
-
**调度模块(调度中心)**
:
-
**调度模块(调度中心)**
:
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
支持可视化、简单且动态的
维
管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
-
**执行模块(执行器)**
:
-
**执行模块(执行器)**
:
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
接收“调度中心”的执行请求、终止请求和日志请求等。
接收“调度中心”的执行请求、终止请求和日志请求等。
...
@@ -1020,6 +1020,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
...
@@ -1020,6 +1020,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
### 6.20 版本 V1.9.0 特性[迭代中]
### 6.20 版本 V1.9.0 特性[迭代中]
-
1、新增任务运行模式 "GLUE模式(NodeJS) ",支持NodeJS脚本任务;
-
1、新增任务运行模式 "GLUE模式(NodeJS) ",支持NodeJS脚本任务;
-
2、修复任务监控线程被耗时任务阻塞的问题;
### TODO LIST
### TODO LIST
-
1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
-
1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
浏览文件 @
ed31b1b6
...
@@ -6,6 +6,7 @@ import com.xxl.job.admin.core.model.XxlJobLog;
...
@@ -6,6 +6,7 @@ import com.xxl.job.admin.core.model.XxlJobLog;
import
com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler
;
import
com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler
;
import
com.xxl.job.admin.core.util.MailUtil
;
import
com.xxl.job.admin.core.util.MailUtil
;
import
com.xxl.job.core.biz.model.ReturnT
;
import
com.xxl.job.core.biz.model.ReturnT
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.slf4j.LoggerFactory
;
...
@@ -35,33 +36,38 @@ public class JobFailMonitorHelper {
...
@@ -35,33 +36,38 @@ public class JobFailMonitorHelper {
@Override
@Override
public
void
run
()
{
public
void
run
()
{
// monitor
// monitor
while
(!
toStop
)
{
while
(!
toStop
)
{
try
{
try
{
Integer
jobLogId
=
JobFailMonitorHelper
.
instance
.
queue
.
take
();
List
<
Integer
>
jobLogIdList
=
new
ArrayList
<
Integer
>();
if
(
jobLogId
!=
null
&&
jobLogId
>
0
)
{
int
drainToNum
=
JobFailMonitorHelper
.
instance
.
queue
.
drainTo
(
jobLogIdList
);
XxlJobLog
log
=
XxlJobDynamicScheduler
.
xxlJobLogDao
.
load
(
jobLogId
);
if
(
log
!=
null
)
{
if
(
ReturnT
.
SUCCESS_CODE
==
log
.
getTriggerCode
()
&&
log
.
getHandleCode
()==
0
)
{
// job running, wait + again monitor
TimeUnit
.
SECONDS
.
sleep
(
10
);
if
(
CollectionUtils
.
isNotEmpty
(
jobLogIdList
))
{
for
(
Integer
jobLogId
:
jobLogIdList
)
{
if
(
jobLogId
==
null
||
jobLogId
==
0
)
{
continue
;
}
XxlJobLog
log
=
XxlJobDynamicScheduler
.
xxlJobLogDao
.
load
(
jobLogId
);
if
(
log
==
null
)
{
continue
;
}
if
(
ReturnT
.
SUCCESS_CODE
==
log
.
getTriggerCode
()
&&
log
.
getHandleCode
()
==
0
)
{
JobFailMonitorHelper
.
monitor
(
jobLogId
);
JobFailMonitorHelper
.
monitor
(
jobLogId
);
logger
.
info
(
">>>>>>>>>>> job monitor, job running, JobLogId:{}"
,
jobLogId
);
logger
.
info
(
">>>>>>>>>>> job monitor, job running, JobLogId:{}"
,
jobLogId
);
}
}
if
(
ReturnT
.
SUCCESS_CODE
==
log
.
getTriggerCode
()
&&
ReturnT
.
SUCCESS_CODE
==
log
.
getHandleCode
())
{
if
(
ReturnT
.
SUCCESS_CODE
==
log
.
getTriggerCode
()
&&
ReturnT
.
SUCCESS_CODE
==
log
.
getHandleCode
())
{
// job success, pass
// job success, pass
logger
.
info
(
">>>>>>>>>>> job monitor, job success, JobLogId:{}"
,
jobLogId
);
logger
.
info
(
">>>>>>>>>>> job monitor, job success, JobLogId:{}"
,
jobLogId
);
}
}
if
(
ReturnT
.
FAIL_CODE
==
log
.
getTriggerCode
()
||
ReturnT
.
FAIL_CODE
==
log
.
getHandleCode
())
{
if
(
ReturnT
.
FAIL_CODE
==
log
.
getTriggerCode
()||
ReturnT
.
FAIL_CODE
==
log
.
getHandleCode
())
{
// job fail,
// job fail,
sendMonitorEmail
(
log
);
sendMonitorEmail
(
log
);
logger
.
info
(
">>>>>>>>>>> job monitor, job fail, JobLogId:{}"
,
jobLogId
);
logger
.
info
(
">>>>>>>>>>> job monitor, job fail, JobLogId:{}"
,
jobLogId
);
}
}
}
}
}
}
TimeUnit
.
SECONDS
.
sleep
(
10
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
logger
.
error
(
"job monitor error:{}"
,
e
);
logger
.
error
(
"job monitor error:{}"
,
e
);
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论