`
can_do
  • 浏览: 247849 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ActiveMQ中由【Channel was inactive for too(30000) long】想到的

阅读更多
【日志】警告信息如下:
//////////begin//////
2014-01-15 16:39:46,030 | WARN  | Transport Connection to: tcp://10.88.112.165:58072 failed: com.cnd.emq.transport.InactivityIOException: Cha
nnel was inactive for too (>30000) long: tcp://10.88.112.165:58072
2014-01-15 16:39:46,030 | INFO  | =catch IOException and stop transport connection =begin=
2014-01-15 16:39:46,030 | WARN  | Transport Connection to: tcp://10.88.112.165:58063 failed: com.cnd.emq.transport.InactivityIOException: Cha
nnel was inactive for too (>30000) long: tcp://10.88.112.165:58063
****************************
//////////end/////////

【分析】:
com\cnd\emq\transport\AbstractInactivityMonitor.java==>
Channecl was inactive for too(>30000) long

onException(new InactivityIOException("Channel was inactive for too (>" + readCheckTime + ") long: " + next.getRemoteAddress()));

//////////end////////

此参数由: readCheckTime ,通过:com.cnd.emq.transport.InactivityMonitor.configuredOk进行设置==>可以通过开debug模式,监测readCheckTime值的大小。
分析如下:
///////begin/////////
2014-01-16 16:16:17,017 | DEBUG | Using min of local: WireFormatInfo { version=10, properties={MaxFrameSize=9223372036854775807, CacheSize=1
024, CacheEnabled=true, SizePrefixDisabled=false, MaxInactivityDurationInitalDelay=10000, TcpNoDelayEnabled=true, MaxInactivityDuration=6000
0, TightEncodingEnabled=true, StackTraceEnabled=true}, magic=[e,M,Q]} and remote: WireFormatInfo { version=10, properties={CacheSize=1024, M
axFrameSize=9223372036854775807, CacheEnabled=true, SizePrefixDisabled=false, TcpNoDelayEnabled=true, MaxInactivityDurationInitalDelay=10000
, MaxInactivityDuration=60000, TightEncodingEnabled=true, StackTraceEnabled=true}, magic=[e,M,Q]}
///////end///////////
取:localWireFormatInfo和remoteWireFormatInfo中MaxInactivityDuration的最小值,所以要同时考虑server和服务器端该值的大小

/////////////begin///////
2014-01-16 16:22:43,096 | DEBUG | Using min of local: WireFormatInfo { version=10, properties={MaxFrameSize=9223372036854775807, CacheSize=1
024, CacheEnabled=true, SizePrefixDisabled=false, MaxInactivityDurationInitalDelay=10000, TcpNoDelayEnabled=true, MaxInactivityDuration=9000
0, TightEncodingEnabled=true, StackTraceEnabled=true}, magic=[e,M,Q]} and remote: WireFormatInfo { version=10, properties={CacheSize=1024, M
axFrameSize=9223372036854775807, CacheEnabled=true, SizePrefixDisabled=false, TcpNoDelayEnabled=true, MaxInactivityDurationInitalDelay=10000
, MaxInactivityDuration=120000, TightEncodingEnabled=true, StackTraceEnabled=true}, magic=[e,M,Q]}
/////////////end/////////

localWireFormatInfo中的MaxInactivityDuration=9000,而remoteWireFormatInfo中的MaxInactivityDuration=120000,

【总结】:如果提示:Channecl was inactive for too(>30000) long的警告,说明该通道处于非活动时间已有30秒,
AMQ中对每个transport都有一个是否活动的检查,检查是否活动的间隔周期是readCheckTime,该参数由MaxInactivityDuration进行设置,
默认是取客户端和服务器端通道WireFormatInfo提供的MaxInactivityDuration的最小值,而设置方式如下:
1、客户端:如:private final String URL = "failover:(tcp://cnd:61616?wireFormat.maxInactivityDuration=120000)";
2、服务器端:如:<transportConnector name="nio" uri="nio://0.0.0.0:61616?wireFormat.maxInactivityDuration=90000"/>
【提示】:在类:com.cnd.emq.transport.InactivityMonitor中有方法startMonitorThreads,来根据读(readCheckTime)和写(writeCheckTime)的检查时间是否大于0,决定是否启动读和写的检查定时器,
所以,对应AMQ,默认读的检查间隔,readCheckTime,由WireFormatInfo中的MaxInactivityDuration来控制。
由此推断,只有将server或者client的MaxInactivityDuration设置为0的话(即采用长连接机制),MQ就不会进行通道的间隔检查。即不会启动是否活动监控的读写检查线程;

3、注意:读检查间隔(readCheckTime)和写检查间隔(writeCheckTime)的关系,如果readCheckTime大于3,则writeCheckTime为其1/3,否则两者相等,而读检查间隔时间来自MaxInactivityDuration,
  所以建议MaxInactivityDuration配置为3的倍数。

4、写间隔是读间隔的1/3。默认读间隔是30000ms,写是10000ms。
5、不配置端按默认30000ms算,即30s,如果客户端和服务器端都不配置此参数的话,那就是30s,如果两端都配置,则取最小的值。==>最终取两端的最小值。

6、检查关键字【Using min of local: WireFormatInfo】

【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics