日期:2014-05-16 浏览次数:21000 次
最近一段时间在用 Apache NIO 框架 Mina, 用起来感觉不错。?
我们使用 Apache NIO 作了一个 TCP server, 来处理 TCP 数据包。?
只是最近突然发现 server 经常连接不上,每周一两次。用户没有进行屏幕截图就直接重新启动,没有找到第一手的故障现场资料。?
开始以为是 JDK 及其他 Java 包 版本问题,连续升级了几次,问题依旧。?
后来终于在客户现场抓个现行。屏幕截图、备份日志文件后,逐个 ping/telnet 各个服务器及其端口。发现都没有问题,奇怪了。突然想起,用 netstat 看看网络连接状态(windows server 2008), 发现大量的 127.0.0.1 到 127.0.0.1 的连接,状态为 ESTABLISHED , 端口看起来是逐步增加的。?
再看日志文件,发现写出来的是 "too many open files” 导致 socket 连接不能建立。?
网上搜索 google ,发现报告此问题的人不少,却没有人有解决方法。Apache Mina 网站上的 FAQ 也提到这个问题,说是要更改 windows 注册表,简直是胡扯。只能自己慢慢调查了。?
这是一个类似于内存泄露的问题,只不过这里是 socket 未关闭导致。英文名词为 : “socket leak”。?
经过几天的调试,发现了解决办法,特记录下来,供大家参考。?
a. 使用到 NioSocketAcceptor 一个,用来 listen ,没有问题。?
b. 自定义 IoHandlerAdapter 在 Mina 中是 Singleton, 只创建一次,也没有问题。?
c. 自定义 IoHandlerAdapter 中需要有以下代码:?
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {?
??????? session.close(true);//force close right now?
}?
public void sess