SNMP4J包 TCP-无超时-网络间断 处理的
发布时间: 2013-01-23 10:44:49 作者: rapoo
SNMP4J包 TCP-无超时-网络中断 处理的BUG
记得之前说过一次关于SNMP4J 服务超时时间的问题 SNMP4J 服务端连接的超时时间? ,由于我们想保持这个连接的持续性,除非异常否则不能在服务端主动切断连接。
但是发现SNMP4J会主动丢掉一些连接,这个在日志中就能看到,这显然不合理。于是我设置了:
?
但是注意,这个对象启动的条件是你设置了超时时间,也就是connectionTimeout 大于 0 时。
往下找会找到一个内部类的子线程,他通过最后使用时间、超时时间、现在时间计算,来判定那个连接需要清理:
?
可以看到,在超时之后,他会关闭连接,并且执行一行代码:
Java代码??
public?static?final?int?decodeLength(BERInputStream?is,?boolean?checkLength)?throws?IOException?{??int?length?=?0;??int?lengthbyte?=?is.read();??if?((lengthbyte?&?ASN_LONG_LEN)?>?0)?{??????lengthbyte?&=?~ASN_LONG_LEN;?/*?turn?MSb?off?*/??????if?(lengthbyte?==?0)?{??????????throw?new?IOException("Indefinite?lengths?are?not?supported");??????}??????if?(lengthbyte?>?4)?{??????????throw?new?IOException(??????????????????"Data?length?>?4?bytes?are?not?supported!");??????}??????for?(int?i?=?0;?i?<?lengthbyte;?i++)?{??????????int?l?=?is.read()?&?0xFF;??????????length?|=?(l?<<?(8?*?((lengthbyte?-?1)?-?i)));??????}??????if?(length?<?0)?{??????????throw?new?IOException(??????????????????"SNMP?does?not?support?data?lengths?>?2^31");??????}??}?else?{?/*?short?asnlength?*/??????length?=?lengthbyte?&?0xFF;??}??/**??*?If?activated?we?do?a?length?check?here:?length?>?is.available()?->??*?throw?exception??*/??if?(checkLength)?{??????checkLength(is,?length);??}??return?length;??
如果这里报错,会在readMessage(sk, readChannel,incomingAddress)时报错,但不是链路问题,如果此时我们也安装链路中断处理就会有问题。?
因此,我把解析头的代码专门try起来,发生问题就不解析,而不是向上层报错,链路断开时还是以前一样:?
在读取消息的代码中:?
Java代码??
try?{??????messageLength?=?messageLengthDecoder.getMessageLength(ByteBuffer.wrap(btnew));??}?catch?(Exception?e)?{??????messageLength?=?null;??????logger.error(e);??}??
这个方法会调用dispatchMessage方法,这个方法也会调用解析函数,所以也要处理:?
Java代码??
try?{??????fireProcessMessage(incomingAddress,?bis);??}?catch?(Exception?e)?{??????logger.error(e);??}??
我的策略是,有问题就不解决,不要向上层调用者反馈解析结果。?
但是有链路断开时再进行反馈,也好让上层就是我们修改的代码知道出问题了,从而从缓存中移除链路信息。
?
请您到ITEYE网站看原创,谢谢!
http://cuisuqiang.iteye.com/?!?