Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
c4f51ba2
提交
c4f51ba2
authored
4月 10, 2020
作者:
xuxueli
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败;
上级
23490980
隐藏空白字符变更
内嵌
并排
正在显示
10 个修改的文件
包含
138 行增加
和
6 行删除
+138
-6
XXL-JOB官方文档.md
doc/XXL-JOB官方文档.md
+7
-2
XxlJobScheduler.java
...ava/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java
+8
-2
JobLosedMonitorHelper.java
.../com/xxl/job/admin/core/thread/JobLosedMonitorHelper.java
+95
-0
XxlJobLogDao.java
...min/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java
+2
-0
application.properties
xxl-job-admin/src/main/resources/application.properties
+1
-1
message_en.properties
xxl-job-admin/src/main/resources/i18n/message_en.properties
+1
-0
message_zh_CN.properties
...ob-admin/src/main/resources/i18n/message_zh_CN.properties
+1
-0
message_zh_TC.properties
...ob-admin/src/main/resources/i18n/message_zh_TC.properties
+1
-0
XxlJobLogMapper.xml
...min/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
+14
-1
DateUtil.java
...ob-core/src/main/java/com/xxl/job/core/util/DateUtil.java
+8
-0
没有找到文件。
doc/XXL-JOB官方文档.md
浏览文件 @
c4f51ba2
...
@@ -1285,11 +1285,16 @@ docker run --name xxl-job-admin -p 8080:8080 -d xuxueli/xxl-job-admin
...
@@ -1285,11 +1285,16 @@ docker run --name xxl-job-admin -p 8080:8080 -d xuxueli/xxl-job-admin
原生提供通用命令行任务Handler(Bean任务,"CommandJobHandler");业务方只需要提供命令行即可;
原生提供通用命令行任务Handler(Bean任务,"CommandJobHandler");业务方只需要提供命令行即可;
如任务参数 "pwd" 将会执行命令并输出数据;
如任务参数 "pwd" 将会执行命令并输出数据;
### 5.22
日志自动清理
### 5.22 日志自动清理
XXL-JOB日志主要包含如下两部分,均支持日志自动清理,说明如下:
XXL-JOB日志主要包含如下两部分,均支持日志自动清理,说明如下:
-
调度中心日志表数据:可借助配置项 "xxl.job.logretentiondays" 设置日志表数据保存天数,过期日志自动清理;详情可查看上文配置说明;
-
调度中心日志表数据:可借助配置项 "xxl.job.logretentiondays" 设置日志表数据保存天数,过期日志自动清理;详情可查看上文配置说明;
-
执行器日志文件数据:可借助配置项 "xxl.job.executor.logretentiondays" 设置日志文件数据保存天数,过期日志自动清理;详情可查看上文配置说明;
-
执行器日志文件数据:可借助配置项 "xxl.job.executor.logretentiondays" 设置日志文件数据保存天数,过期日志自动清理;详情可查看上文配置说明;
### 5.23 调度结果丢失处理
执行器因网络抖动回调失败或宕机等异常情况,会导致任务调度结果丢失。由于调度中心依赖执行器回调来感知调度结果,因此会导致调度日志永远处于 "运行中" 状态。
针对该问题,调度中心提供内置组件进行处理,逻辑为:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败;
## 六、版本更新日志
## 六、版本更新日志
### 6.1 版本 V1.1.x,新特性[2015-12-05]
### 6.1 版本 V1.1.x,新特性[2015-12-05]
...
@@ -1732,7 +1737,7 @@ data: post-data
...
@@ -1732,7 +1737,7 @@ data: post-data
-
17、任务复制功能:点击复制是弹出新建任务弹框,并初始化被复制任务信息;
-
17、任务复制功能:点击复制是弹出新建任务弹框,并初始化被复制任务信息;
-
18、执行器UI交互优化,移除冗余order属性;
-
18、执行器UI交互优化,移除冗余order属性;
-
19、任务手动执行一次的时候,支持指定本次执行的机器地址,为空则从执行器获取
-
19、任务手动执行一次的时候,支持指定本次执行的机器地址,为空则从执行器获取
-
20、
[
迭代中
]
任务结果丢失处理:针对长期处于运行中的任务(设置过期时间时,运行超过"过期时间+1min";未设置超时时间时,运行超过"30min"),主动检测该执行器是否在线,如果不在线
主动标记失败;
-
20、
任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度
主动标记失败;
-
21、
[
迭代中
]
调度中心与执行器通讯规范为双向restful,方便跨语言,以及第三方执行器实现;通讯组件xxl-rpc方案调整为Jetty+Gson方案;
-
21、
[
迭代中
]
调度中心与执行器通讯规范为双向restful,方便跨语言,以及第三方执行器实现;通讯组件xxl-rpc方案调整为Jetty+Gson方案;
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java
浏览文件 @
c4f51ba2
...
@@ -31,9 +31,12 @@ public class XxlJobScheduler {
...
@@ -31,9 +31,12 @@ public class XxlJobScheduler {
// admin registry monitor run
// admin registry monitor run
JobRegistryMonitorHelper
.
getInstance
().
start
();
JobRegistryMonitorHelper
.
getInstance
().
start
();
// admin monitor run
// admin
fail-
monitor run
JobFailMonitorHelper
.
getInstance
().
start
();
JobFailMonitorHelper
.
getInstance
().
start
();
// admin lose-monitor run
JobLosedMonitorHelper
.
getInstance
().
start
();
// admin trigger pool start
// admin trigger pool start
JobTriggerPoolHelper
.
toStart
();
JobTriggerPoolHelper
.
toStart
();
...
@@ -58,7 +61,10 @@ public class XxlJobScheduler {
...
@@ -58,7 +61,10 @@ public class XxlJobScheduler {
// admin trigger pool stop
// admin trigger pool stop
JobTriggerPoolHelper
.
toStop
();
JobTriggerPoolHelper
.
toStop
();
// admin monitor stop
// admin lose-monitor stop
JobLosedMonitorHelper
.
getInstance
().
toStop
();
// admin fail-monitor stop
JobFailMonitorHelper
.
getInstance
().
toStop
();
JobFailMonitorHelper
.
getInstance
().
toStop
();
// admin registry stop
// admin registry stop
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLosedMonitorHelper.java
0 → 100644
浏览文件 @
c4f51ba2
package
com
.
xxl
.
job
.
admin
.
core
.
thread
;
import
com.xxl.job.admin.core.conf.XxlJobAdminConfig
;
import
com.xxl.job.admin.core.model.XxlJobLog
;
import
com.xxl.job.admin.core.util.I18nUtil
;
import
com.xxl.job.core.biz.model.ReturnT
;
import
com.xxl.job.core.util.DateUtil
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.TimeUnit
;
/**
* job lose-monitor instance
*
* @author xuxueli 2015-9-1 18:05:56
*/
public
class
JobLosedMonitorHelper
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
JobLosedMonitorHelper
.
class
);
private
static
JobLosedMonitorHelper
instance
=
new
JobLosedMonitorHelper
();
public
static
JobLosedMonitorHelper
getInstance
(){
return
instance
;
}
// ---------------------- monitor ----------------------
private
Thread
monitorThread
;
private
volatile
boolean
toStop
=
false
;
public
void
start
(){
monitorThread
=
new
Thread
(
new
Runnable
()
{
@Override
public
void
run
()
{
// monitor
while
(!
toStop
)
{
try
{
// 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败;
Date
losedTime
=
DateUtil
.
addMinutes
(
new
Date
(),
-
10
);
List
<
Long
>
losedJobIds
=
XxlJobAdminConfig
.
getAdminConfig
().
getXxlJobLogDao
().
findLostJobIds
(
losedTime
);
if
(
losedJobIds
!=
null
&&
losedJobIds
.
size
()>
0
)
{
for
(
Long
logId:
losedJobIds
)
{
XxlJobLog
jobLog
=
new
XxlJobLog
();
jobLog
.
setId
(
logId
);
jobLog
.
setHandleTime
(
new
Date
());
jobLog
.
setHandleCode
(
ReturnT
.
FAIL_CODE
);
jobLog
.
setHandleMsg
(
I18nUtil
.
getString
(
"joblog_lost_fail"
)
);
XxlJobAdminConfig
.
getAdminConfig
().
getXxlJobLogDao
().
updateHandleInfo
(
jobLog
);
}
}
}
catch
(
Exception
e
)
{
if
(!
toStop
)
{
logger
.
error
(
">>>>>>>>>>> xxl-job, job fail monitor thread error:{}"
,
e
);
}
}
try
{
TimeUnit
.
SECONDS
.
sleep
(
60
);
}
catch
(
Exception
e
)
{
if
(!
toStop
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
}
logger
.
info
(
">>>>>>>>>>> xxl-job, job fail monitor thread stop"
);
}
});
monitorThread
.
setDaemon
(
true
);
monitorThread
.
setName
(
"xxl-job, admin JobFailMonitorHelper"
);
monitorThread
.
start
();
}
public
void
toStop
(){
toStop
=
true
;
// interrupt and wait
monitorThread
.
interrupt
();
try
{
monitorThread
.
join
();
}
catch
(
InterruptedException
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
}
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java
浏览文件 @
c4f51ba2
...
@@ -57,4 +57,6 @@ public interface XxlJobLogDao {
...
@@ -57,4 +57,6 @@ public interface XxlJobLogDao {
@Param
(
"oldAlarmStatus"
)
int
oldAlarmStatus
,
@Param
(
"oldAlarmStatus"
)
int
oldAlarmStatus
,
@Param
(
"newAlarmStatus"
)
int
newAlarmStatus
);
@Param
(
"newAlarmStatus"
)
int
newAlarmStatus
);
public
List
<
Long
>
findLostJobIds
(
@Param
(
"losedTime"
)
Date
losedTime
);
}
}
xxl-job-admin/src/main/resources/application.properties
浏览文件 @
c4f51ba2
...
@@ -23,7 +23,7 @@ mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
...
@@ -23,7 +23,7 @@ mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
### xxl-job, datasource
### xxl-job, datasource
spring.datasource.url
=
jdbc:mysql://127.0.0.1:3306/xxl_job?
Unicode=true&characterEncoding=UTF-8
spring.datasource.url
=
jdbc:mysql://127.0.0.1:3306/xxl_job?
useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username
=
root
spring.datasource.username
=
root
spring.datasource.password
=
root_pwd
spring.datasource.password
=
root_pwd
spring.datasource.driver-class-name
=
com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name
=
com.mysql.cj.jdbc.Driver
...
...
xxl-job-admin/src/main/resources/i18n/message_en.properties
浏览文件 @
c4f51ba2
...
@@ -178,6 +178,7 @@ joblog_handleCode_502=Timeout
...
@@ -178,6 +178,7 @@ joblog_handleCode_502=Timeout
joblog_kill_log
=
Kill Job
joblog_kill_log
=
Kill Job
joblog_kill_log_limit
=
Trigger Fail, can not kill job
joblog_kill_log_limit
=
Trigger Fail, can not kill job
joblog_kill_log_byman
=
Manual operation, kill job
joblog_kill_log_byman
=
Manual operation, kill job
joblog_lost_fail
=
Job result lost, marked as failure
joblog_rolling_log
=
Rolling log
joblog_rolling_log
=
Rolling log
joblog_rolling_log_refresh
=
Refresh
joblog_rolling_log_refresh
=
Refresh
joblog_rolling_log_triggerfail
=
The job trigger fail, can not view the rolling log
joblog_rolling_log_triggerfail
=
The job trigger fail, can not view the rolling log
...
...
xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties
浏览文件 @
c4f51ba2
...
@@ -178,6 +178,7 @@ joblog_handleCode_502=失败(超时)
...
@@ -178,6 +178,7 @@ joblog_handleCode_502=失败(超时)
joblog_kill_log
=
终止任务
joblog_kill_log
=
终止任务
joblog_kill_log_limit
=
调度失败,无法终止日志
joblog_kill_log_limit
=
调度失败,无法终止日志
joblog_kill_log_byman
=
人为操作,主动终止
joblog_kill_log_byman
=
人为操作,主动终止
joblog_lost_fail
=
任务结果丢失,标记失败
joblog_rolling_log
=
执行日志
joblog_rolling_log
=
执行日志
joblog_rolling_log_refresh
=
刷新
joblog_rolling_log_refresh
=
刷新
joblog_rolling_log_triggerfail
=
任务发起调度失败,无法查看执行日志
joblog_rolling_log_triggerfail
=
任务发起调度失败,无法查看执行日志
...
...
xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties
浏览文件 @
c4f51ba2
...
@@ -178,6 +178,7 @@ joblog_handleCode_502=失敗(超時)
...
@@ -178,6 +178,7 @@ joblog_handleCode_502=失敗(超時)
joblog_kill_log
=
终止任務
joblog_kill_log
=
终止任務
joblog_kill_log_limit
=
調度失敗,無法终止日誌
joblog_kill_log_limit
=
調度失敗,無法终止日誌
joblog_kill_log_byman
=
人為操作,主動終止
joblog_kill_log_byman
=
人為操作,主動終止
joblog_lost_fail
=
任務結果丟失,標記失敗
joblog_rolling_log
=
執行日誌
joblog_rolling_log
=
執行日誌
joblog_rolling_log_refresh
=
更新
joblog_rolling_log_refresh
=
更新
joblog_rolling_log_triggerfail
=
任務發起調度失敗,無法查看執行日誌
joblog_rolling_log_triggerfail
=
任務發起調度失敗,無法查看執行日誌
...
...
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
浏览文件 @
c4f51ba2
...
@@ -245,5 +245,17 @@
...
@@ -245,5 +245,17 @@
`alarm_status` = #{newAlarmStatus}
`alarm_status` = #{newAlarmStatus}
WHERE `id`= #{logId} AND `alarm_status` = #{oldAlarmStatus}
WHERE `id`= #{logId} AND `alarm_status` = #{oldAlarmStatus}
</update>
</update>
<select
id=
"findLostJobIds"
resultType=
"long"
>
SELECT t.id
FROM xxl_job_log AS t
WHERE t.trigger_code = 200
and t.handle_code = 0
and t.trigger_time
<![CDATA[ <= ]]>
#{losedTime}
and t.executor_address not in (
SELECT t2.registry_value
FROM xxl_job_registry AS t2
)
</select>
</mapper>
</mapper>
\ No newline at end of file
xxl-job-core/src/main/java/com/xxl/job/core/util/DateUtil.java
浏览文件 @
c4f51ba2
...
@@ -135,6 +135,14 @@ public class DateUtil {
...
@@ -135,6 +135,14 @@ public class DateUtil {
return
add
(
date
,
Calendar
.
DAY_OF_MONTH
,
amount
);
return
add
(
date
,
Calendar
.
DAY_OF_MONTH
,
amount
);
}
}
public
static
Date
addHours
(
final
Date
date
,
final
int
amount
)
{
return
add
(
date
,
Calendar
.
HOUR_OF_DAY
,
amount
);
}
public
static
Date
addMinutes
(
final
Date
date
,
final
int
amount
)
{
return
add
(
date
,
Calendar
.
MINUTE
,
amount
);
}
private
static
Date
add
(
final
Date
date
,
final
int
calendarField
,
final
int
amount
)
{
private
static
Date
add
(
final
Date
date
,
final
int
calendarField
,
final
int
amount
)
{
if
(
date
==
null
)
{
if
(
date
==
null
)
{
return
null
;
return
null
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论