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】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值