首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

SNMP4J包 TCP-无超时-网络间断 处理的BUG

2013-01-23 
SNMP4J包 TCP-无超时-网络中断 处理的BUG记得之前说过一次关于SNMP4J 服务超时时间的问题 SNMP4J 服务端连

SNMP4J包 TCP-无超时-网络中断 处理的BUG

记得之前说过一次关于SNMP4J 服务超时时间的问题 SNMP4J 服务端连接的超时时间? ,由于我们想保持这个连接的持续性,除非异常否则不能在服务端主动切断连接。

但是发现SNMP4J会主动丢掉一些连接,这个在日志中就能看到,这显然不合理。于是我设置了:

?

但是注意,这个对象启动的条件是你设置了超时时间,也就是connectionTimeout 大于 0 时。

往下找会找到一个内部类的子线程,他通过最后使用时间、超时时间、现在时间计算,来判定那个连接需要清理:

?

可以看到,在超时之后,他会关闭连接,并且执行一行代码:

Java代码??SNMP4J包 TCP-无超时-网络间断 处理的BUG
  • 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代码??SNMP4J包 TCP-无超时-网络间断 处理的BUG
  • try?{??
  • ????messageLength?=?messageLengthDecoder.getMessageLength(ByteBuffer.wrap(btnew));??
  • }?catch?(Exception?e)?{??
  • ????messageLength?=?null;??
  • ????logger.error(e);??
  • }??



    这个方法会调用dispatchMessage方法,这个方法也会调用解析函数,所以也要处理:?

    Java代码??SNMP4J包 TCP-无超时-网络间断 处理的BUG
  • try?{??
  • ????fireProcessMessage(incomingAddress,?bis);??
  • }?catch?(Exception?e)?{??
  • ????logger.error(e);??
  • }??



    我的策略是,有问题就不解决,不要向上层调用者反馈解析结果。?
    但是有链路断开时再进行反馈,也好让上层就是我们修改的代码知道出问题了,从而从缓存中移除链路信息。

    ?

    请您到ITEYE网站看原创,谢谢!

    http://cuisuqiang.iteye.com/?!?

  • 热点排行