Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Apache RocketMQ
Rocketmq
提交
a2f8810c
R
Rocketmq
项目概览
Apache RocketMQ
/
Rocketmq
上一次同步 大约 3 年
通知
267
Star
16139
Fork
68
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rocketmq
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
未验证
提交
a2f8810c
编写于
6月 25, 2021
作者:
Y
yuz10
提交者:
GitHub
6月 25, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[ISSUE #2988] fix fail to send trace of last message before shutting down producer
上级
6b519ef1
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
37 addition
and
33 deletion
+37
-33
client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java
...rg/apache/rocketmq/client/trace/AsyncTraceDispatcher.java
+37
-33
未找到文件。
client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java
浏览文件 @
a2f8810c
...
...
@@ -16,7 +16,6 @@
*/
package
org.apache.rocketmq.client.trace
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.HashSet
;
...
...
@@ -30,6 +29,7 @@ import java.util.concurrent.TimeUnit;
import
java.util.concurrent.atomic.AtomicBoolean
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.concurrent.atomic.AtomicLong
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.rocketmq.client.AccessChannel
;
import
org.apache.rocketmq.client.common.ThreadLocalIndex
;
...
...
@@ -64,7 +64,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher {
// The last discard number of log
private
AtomicLong
discardCount
;
private
Thread
worker
;
private
ArrayBlockingQueue
<
TraceContext
>
traceContextQueue
;
private
final
ArrayBlockingQueue
<
TraceContext
>
traceContextQueue
;
private
ArrayBlockingQueue
<
Runnable
>
appenderQueue
;
private
volatile
Thread
shutDownHook
;
private
volatile
boolean
stopped
=
false
;
...
...
@@ -78,7 +78,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher {
private
String
group
;
private
Type
type
;
public
AsyncTraceDispatcher
(
String
group
,
Type
type
,
String
traceTopicName
,
RPCHook
rpcHook
)
{
public
AsyncTraceDispatcher
(
String
group
,
Type
type
,
String
traceTopicName
,
RPCHook
rpcHook
)
{
// queueSize is greater than or equal to the n power of 2 of value
this
.
queueSize
=
2048
;
this
.
batchSize
=
100
;
...
...
@@ -95,12 +95,12 @@ public class AsyncTraceDispatcher implements TraceDispatcher {
this
.
traceTopicName
=
TopicValidator
.
RMQ_SYS_TRACE_TOPIC
;
}
this
.
traceExecutor
=
new
ThreadPoolExecutor
(
//
10
,
//
20
,
//
1000
*
60
,
//
TimeUnit
.
MILLISECONDS
,
//
this
.
appenderQueue
,
//
new
ThreadFactoryImpl
(
"MQTraceSendThread_"
));
10
,
//
20
,
//
1000
*
60
,
//
TimeUnit
.
MILLISECONDS
,
//
this
.
appenderQueue
,
//
new
ThreadFactoryImpl
(
"MQTraceSendThread_"
));
traceProducer
=
getAndCreateTraceProducer
(
rpcHook
);
}
...
...
@@ -180,10 +180,15 @@ public class AsyncTraceDispatcher implements TraceDispatcher {
}
@Override
public
void
flush
()
throws
IOException
{
public
void
flush
()
{
// The maximum waiting time for refresh,avoid being written all the time, resulting in failure to return.
long
end
=
System
.
currentTimeMillis
()
+
500
;
while
(
traceContextQueue
.
size
()
>
0
||
appenderQueue
.
size
()
>
0
&&
System
.
currentTimeMillis
()
<=
end
)
{
while
(
System
.
currentTimeMillis
()
<=
end
)
{
synchronized
(
traceContextQueue
)
{
if
(
traceContextQueue
.
size
()
==
0
&&
appenderQueue
.
size
()
==
0
)
{
break
;
}
}
try
{
Thread
.
sleep
(
1
);
}
catch
(
InterruptedException
e
)
{
...
...
@@ -196,6 +201,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher {
@Override
public
void
shutdown
()
{
this
.
stopped
=
true
;
flush
();
this
.
traceExecutor
.
shutdown
();
if
(
isStarted
.
get
())
{
traceProducer
.
shutdown
();
...
...
@@ -212,11 +218,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher {
public
void
run
()
{
synchronized
(
this
)
{
if
(!
this
.
hasShutdown
)
{
try
{
flush
();
}
catch
(
IOException
e
)
{
log
.
error
(
"system MQTrace hook shutdown failed ,maybe loss some trace data"
);
}
flush
();
}
}
}
...
...
@@ -242,25 +244,27 @@ public class AsyncTraceDispatcher implements TraceDispatcher {
public
void
run
()
{
while
(!
stopped
)
{
List
<
TraceContext
>
contexts
=
new
ArrayList
<
TraceContext
>(
batchSize
);
for
(
int
i
=
0
;
i
<
batchSize
;
i
++)
{
TraceContext
context
=
null
;
try
{
//get trace data element from blocking Queue — traceContextQueue
context
=
traceContextQueue
.
poll
(
5
,
TimeUnit
.
MILLISECONDS
);
}
catch
(
InterruptedException
e
)
{
synchronized
(
traceContextQueue
)
{
for
(
int
i
=
0
;
i
<
batchSize
;
i
++)
{
TraceContext
context
=
null
;
try
{
//get trace data element from blocking Queue - traceContextQueue
context
=
traceContextQueue
.
poll
(
5
,
TimeUnit
.
MILLISECONDS
);
}
catch
(
InterruptedException
e
)
{
}
if
(
context
!=
null
)
{
contexts
.
add
(
context
);
}
else
{
break
;
}
}
if
(
context
!=
null
)
{
contexts
.
add
(
context
);
}
else
{
break
;
if
(
contexts
.
size
()
>
0
)
{
AsyncAppenderRequest
request
=
new
AsyncAppenderRequest
(
contexts
);
traceExecutor
.
submit
(
request
);
}
else
if
(
AsyncTraceDispatcher
.
this
.
stopped
)
{
this
.
stopped
=
true
;
}
}
if
(
contexts
.
size
()
>
0
)
{
AsyncAppenderRequest
request
=
new
AsyncAppenderRequest
(
contexts
);
traceExecutor
.
submit
(
request
);
}
else
if
(
AsyncTraceDispatcher
.
this
.
stopped
)
{
this
.
stopped
=
true
;
}
}
}
...
...
@@ -352,7 +356,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher {
* Send message trace data
*
* @param keySet the keyset in this batch(including msgId in original message not offsetMsgId)
* @param data the message trace data in this batch
* @param data
the message trace data in this batch
*/
private
void
sendTraceDataByMQ
(
Set
<
String
>
keySet
,
final
String
data
,
String
dataTopic
,
String
regionId
)
{
String
traceTopic
=
traceTopicName
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录