Mina打开文件过多问题解决方案

最近在使用mina开发过程中遇到了打开文件过多问题,一大堆的java.io.IOException: Too many open files。网上搜索问题的解决方案,大多都是修改Linux系统的配置,提高程序打开文件的数量。
然而并没有什么卵用,因为你程序上的根本问题没有得到解决,再怎么设置都会有瓶颈。
打开文件过多,造成的原因,一般有以下两种情况:
1.打开的文件没有关闭
2.通讯连接没有完全关闭

有人可能有疑问了,为什么打开文件过多和通讯有什么关系。这也正是很多人出现问题不知道是通讯造成的原因,而错误盲目的乱改代码。真正的原因是因为Linux系统上一个socket就是一个打开的文件,因此过多的socket未被完全关闭,就会造成打开文件过多。
那么如何彻底的关闭Mina的socket连接呢,看以下代码:

public void test(){
    IoConnector connector = null;
    IoSession session = null;
    try {
        if (null == session || null == session.getRemoteAddress() || !session.isConnected()) {
            connector = new NioSocketConnector();
            // 连接服务器动作,超时时间为3秒
            connector.setConnectTimeoutMillis(3000L);
            connector.getSessionConfig().setUseReadOperation(true);
            // 创建接收数据的过滤器
            DefaultIoFilterChainBuilder chain = connector.getFilterChain();
            // 设置通信协议
            chain.addLast("codec", new ProtocolCodecFilter(new AppClientCodecFactory()));
            /** update by Herman.Xiong at 2014年11月21日 16:34:15 新增心跳处理 */
            //chain.addLast("keepAlive", new ControlHeatbeat());
            // 设定客户端的消息处理器:一个AppClientHandler对象
            connector.setHandler(new AscJavaClientHandler());
            // 连结到服务器:
            ConnectFuture cf = connector.connect(new InetSocketAddress("10.10.2.215", 6001));
            // 等待连接创建完成
            cf.awaitUninterruptibly();
            // 获取会话
            session = cf.getSession();
            session.write(message).awaitUninterruptibly(); //由于上面已经设置setUseReadOperation(true),故IoSession.read()方法才可用  
            ReadFuture readFuture = session.read(); //因其内部使用BlockingQueue,故Server端用之可能会内存泄漏,但Client端可适当用之  
            if(readFuture.awaitUninterruptibly(90, TimeUnit.SECONDS)){ //等到收到消息  
                log.info(readFuture.getMessage());//获取收到的消息
            }else{  
                log.warn("读取[/" + ipAddress + ":" + port + "]超时");
            }  
        }
    }catch (Exception e) {
        log.error("通讯异常!"+e.getMessage(),e);
    }finally{
        // 等待连接关闭
        if (null != session) {
            session.close(true);
            session.getService().dispose();
            session=null;
        }
        // 关闭客户端线程
        if (null != connector) {
            connector.dispose();
            connector=null;
        }
    }
}

很多人就是因为没有写session.getService().dispose();和connector.dispose();导致文件句柄泄漏的。当总的文件句柄数超过系统设置值(ulimit -n  查看同一个进程允许的最大文件句柄数),则抛出异常“java.io.IOException: Too many open  files",导致无法创建新的连接,服务器挂掉。

版权声明:本文为博主原创文章,未经博主允许不得转载。原文地址http://www.xttblog.com/?p=446

Mina打开文件过多问题解决方案

: » Mina打开文件过多问题解决方案

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/251436.html

(0)
上一篇 2022年5月3日
下一篇 2022年5月3日

相关推荐

发表回复

登录后才能评论