日期:2014-05-16  浏览次数:21000 次

Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法(转)

最近一段时间在用 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