Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
293ffca1
提交
293ffca1
authored
6月 20, 2019
作者:
xuxueli
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
调度组件销毁流程优化,先停止调度线程,然后等待时间轮内存量任务处理完成,最终销毁时间轮线程;
上级
998da25c
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
56 行增加
和
16 行删除
+56
-16
XXL-JOB官方文档.md
doc/XXL-JOB官方文档.md
+1
-0
JobScheduleHelper.java
...java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
+55
-16
没有找到文件。
doc/XXL-JOB官方文档.md
浏览文件 @
293ffca1
...
...
@@ -1477,6 +1477,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
-
11、升级xxl-rpc至较新版本,修复代理服务初始化时远程服务不可用导致长连冗余创建的问题;
-
12、首页调度报表的日期排序在TIDB下乱序问题修复;
-
13、调度中心与执行器双向通讯超时时间调整为3s;
-
14、调度组件销毁流程优化,先停止调度线程,然后等待时间轮内存量任务处理完成,最终销毁时间轮线程;
### 6.26 版本 v2.1.1 Release Notes[规划中]
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
浏览文件 @
293ffca1
...
...
@@ -27,7 +27,8 @@ public class JobScheduleHelper {
private
Thread
scheduleThread
;
private
Thread
ringThread
;
private
volatile
boolean
toStop
=
false
;
private
volatile
boolean
scheduleThreadToStop
=
false
;
private
volatile
boolean
ringThreadToStop
=
false
;
private
volatile
static
Map
<
Integer
,
List
<
Integer
>>
ringData
=
new
ConcurrentHashMap
<>();
public
void
start
(){
...
...
@@ -40,13 +41,13 @@ public class JobScheduleHelper {
try
{
TimeUnit
.
MILLISECONDS
.
sleep
(
5000
-
System
.
currentTimeMillis
()%
1000
);
}
catch
(
InterruptedException
e
)
{
if
(!
t
oStop
)
{
if
(!
scheduleThreadT
oStop
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
logger
.
info
(
">>>>>>>>> init xxl-job admin scheduler success."
);
while
(!
t
oStop
)
{
while
(!
scheduleThreadT
oStop
)
{
// 扫描任务
long
start
=
System
.
currentTimeMillis
();
...
...
@@ -127,7 +128,7 @@ public class JobScheduleHelper {
conn
.
commit
();
}
catch
(
Exception
e
)
{
if
(!
t
oStop
)
{
if
(!
scheduleThreadT
oStop
)
{
logger
.
error
(
">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread error:{}"
,
e
);
}
}
finally
{
...
...
@@ -152,7 +153,7 @@ public class JobScheduleHelper {
TimeUnit
.
MILLISECONDS
.
sleep
(
1000
-
System
.
currentTimeMillis
()%
1000
);
}
}
catch
(
InterruptedException
e
)
{
if
(!
t
oStop
)
{
if
(!
scheduleThreadT
oStop
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
...
...
@@ -175,13 +176,13 @@ public class JobScheduleHelper {
try
{
TimeUnit
.
MILLISECONDS
.
sleep
(
1000
-
System
.
currentTimeMillis
()%
1000
);
}
catch
(
InterruptedException
e
)
{
if
(!
t
oStop
)
{
if
(!
ringThreadT
oStop
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
int
lastSecond
=
-
1
;
while
(!
t
oStop
)
{
while
(!
ringThreadT
oStop
)
{
try
{
// second data
...
...
@@ -216,7 +217,7 @@ public class JobScheduleHelper {
ringItemData
.
clear
();
}
}
catch
(
Exception
e
)
{
if
(!
t
oStop
)
{
if
(!
ringThreadT
oStop
)
{
logger
.
error
(
">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread error:{}"
,
e
);
}
}
...
...
@@ -225,7 +226,7 @@ public class JobScheduleHelper {
try
{
TimeUnit
.
MILLISECONDS
.
sleep
(
1000
-
System
.
currentTimeMillis
()%
1000
);
}
catch
(
InterruptedException
e
)
{
if
(!
t
oStop
)
{
if
(!
ringThreadT
oStop
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
...
...
@@ -239,23 +240,61 @@ public class JobScheduleHelper {
}
public
void
toStop
(){
toStop
=
true
;
//
interrupt and wait
scheduleThread
.
interrupt
()
;
//
1、stop schedule
scheduleThread
ToStop
=
true
;
try
{
scheduleThread
.
join
();
TimeUnit
.
SECONDS
.
sleep
(
1
);
// wait
}
catch
(
InterruptedException
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
if
(
scheduleThread
.
getState
()
!=
Thread
.
State
.
TERMINATED
){
// interrupt and wait
scheduleThread
.
interrupt
();
try
{
scheduleThread
.
join
();
}
catch
(
InterruptedException
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
// interrupt and wait
ringThread
.
interrupt
();
// if has ring data
boolean
hasRingData
=
false
;
if
(!
ringData
.
isEmpty
())
{
for
(
int
second
:
ringData
.
keySet
())
{
List
<
Integer
>
tmpData
=
ringData
.
get
(
second
);
if
(
tmpData
!=
null
&&
tmpData
.
size
()>
0
)
{
hasRingData
=
true
;
break
;
}
}
}
if
(
hasRingData
)
{
try
{
TimeUnit
.
SECONDS
.
sleep
(
8
);
}
catch
(
InterruptedException
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
// stop ring (wait job-in-memory stop)
ringThreadToStop
=
true
;
try
{
ringThread
.
join
(
);
TimeUnit
.
SECONDS
.
sleep
(
1
);
}
catch
(
InterruptedException
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
if
(
ringThread
.
getState
()
!=
Thread
.
State
.
TERMINATED
){
// interrupt and wait
ringThread
.
interrupt
();
try
{
ringThread
.
join
();
}
catch
(
InterruptedException
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
logger
.
info
(
">>>>>>>>>>> xxl-job, JobScheduleHelper stop"
);
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论