`
snoopy7713
  • 浏览: 1149142 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

mina高并发短连接导致java.io.IOException: Too many open files解决方案

阅读更多

   这几天在解决一个用mina开发的高并发通信过程中产生的一个bug。

   模拟场景为:

   通过定时触发启动线程模拟高并发短连接测试,测试的服务端有2个,一个是服务有起,一个没起,客户端和服务端均在同一服务器上。执行一段时间后linux主机上通过lsof命令查看,发现有递增的文件句柄,pipe和eventpoll。

   抛出的异常如下:

 

Java代码  收藏代码
  1. 2012 - 10 - 13   10 : 09 : 48  -org.apache.mina.core.service.SimpleIoProcessorPool.<init>(SimpleIoProcessorPool.java: 197 )  
  2.  Failed to create a new  instance of org.apache.mina.transport.socket.nio.NioProcessor: null   
  3. java.lang.reflect.InvocationTargetException  
  4.         at sun.reflect.GeneratedConstructorAccessor110.newInstance(Unknown Source)  
  5.         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27 )  
  6.         at java.lang.reflect.Constructor.newInstance(Constructor.java:513 )  
  7.         at org.apache.mina.core.service.SimpleIoProcessorPool.<init>(SimpleIoProcessorPool.java:180 )  
  8.         at org.apache.mina.core.service.SimpleIoProcessorPool.<init>(SimpleIoProcessorPool.java:112 )  
  9.         at org.apache.mina.core.polling.AbstractPollingIoConnector.<init>(AbstractPollingIoConnector.java:93 )  
  10.         at org.apache.mina.transport.socket.nio.NioSocketConnector.<init>(NioSocketConnector.java:56 )  
  11.         at com.develop.webplatform.funnel.client.JobClient.sendMessage(JobClient.java:39 )  
  12.         at com.develop.webplatform.funnel.client.JobClient.sendJob(JobClient.java:126 )  
  13.         at com.develop.webplatform.funnel.extend.JobExecRemotelyBySocket.execJobByTask(JobExecRemotelyBySocket.java:66 )  
  14.         at com.develop.webplatform.funnel.JobManager.execJobByTask(JobManager.java:27 )  
  15.         at com.develop.webplatform.quartz.job.TaskJob.executeInternal(TaskJob.java:38 )  
  16.         at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86 )  
  17.         at org.quartz.core.JobRunShell.run(JobRunShell.java:223 )  
  18.         at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549 )  
  19. Caused by: org.apache.mina.core.RuntimeIoException: Failed to open a selector.  
  20.         at org.apache.mina.transport.socket.nio.NioProcessor.<init>(NioProcessor.java:61 )  
  21.         ... 15  more  
  22. Caused by: java.io.IOException: Too many open files  
  23.         at sun.nio.ch.IOUtil.initPipe(Native Method)  
  24.         at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:49 )  
  25.         at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:18 )  
  26.         at java.nio.channels.Selector.open(Selector.java:209 )  
  27.         at org.apache.mina.transport.socket.nio.NioProcessor.<init>(NioProcessor.java:59 )  
  28.         ... 15  more  

 

    原代码中,关于客户端连接的代码如下:

 

Java代码  收藏代码
  1. final  NioSocketConnector connector =  new  NioSocketConnector();  
  2.         final  String[] result =  new  String[ 1 ];  
  3.         connector.getFilterChain().addLast("codec" ,  
  4.                 new  ProtocolCodecFilter( new  ObjectSerializationCodecFactory()));  
  5.         connector.setHandler(handler);  
  6.   
  7.         //设置超时   
  8.         connector.setConnectTimeoutMillis(defaultConnectTimeOut);  
  9.         ConnectFuture connectFuture = connector.connect(address);  
  10.         connectFuture.awaitUninterruptibly();   //同步,等待,直到连接完成   
  11.         if  (connectFuture.isDone()) {  
  12.             if  (!connectFuture.isConnected()) {  //若在指定时间内没连接成功,则抛出异常   
  13.                 logger.info("fail to connect "  + logInfo);  
  14.   
  15.                 throw   new  Exception();  
  16.             }  
  17.         }  

 

         经过分析,导致主机文件句柄泄露的原因为,客户端发起服务端连接时,会请求系统分配相关的文件句柄,在原代码中,仅仅判断是否连接成功,而未对连接失败进 行资源释放,从而造成文件句柄泄露。当总的文件句柄数超过系统设置值(ulimit -n 查看同一个进程允许的最大文件句柄数),则抛出异常“java.io.IOException: Too many open files",导致无法创建新的连接,服务器挂掉。

      更改后的代码如下:

 

Java代码  收藏代码
  1. final  NioSocketConnector connector =  new  NioSocketConnector();  
  2.         final  String[] result =  new  String[ 1 ];  
  3.         connector.getFilterChain().addLast("codec" ,  
  4.                 new  ProtocolCodecFilter( new  ObjectSerializationCodecFactory()));  
  5.         connector.setHandler(handler);  
  6.   
  7.         //设置超时   
  8.         connector.setConnectTimeoutMillis(defaultConnectTimeOut);  
  9.         ConnectFuture connectFuture = connector.connect(address);  
  10.         connectFuture.awaitUninterruptibly();   //同步,等待,直到连接完成   
  11.         if  (connectFuture.isDone()) {  
  12.             if  (!connectFuture.isConnected()) {  //若在指定时间内没连接成功,则抛出异常   
  13.                 logger.info("fail to connect "  + logInfo);  
  14.                 connector.dispose();    //不关闭的话会运行一段时间后抛出,too many open files异常,导致无法连接   
  15.   
  16.                 throw   new  Exception();  
  17.             }  
  18.         } 
分享到:
评论

相关推荐

    Mina实现长连接和短连接实例

    Apache Mina是一个流行的Java框架,专门用于简化和优化网络应用开发,它支持多种协议如TCP/IP、UDP/IP等,并提供了长连接和短连接的支持。在这个实例中,我们将探讨如何使用Mina实现长连接和短连接。 首先,理解长...

    Apache Mina核心jar包:mina-core-2.0.7

    Apache MINA是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。 当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版...

    apache-mina-2.0.4.rar_apache mina_mina

    它基于Java NIO(非阻塞I/O)构建,允许在高并发场景下高效地处理连接和数据传输。Mina支持多种网络协议,如TCP/IP、UDP/IP以及HTTP、FTP等,因此常被用于构建网络服务,如代理服务器、聊天应用、数据库中间件等。 ...

    基于java的开发源码-mina高性能Java网络框架.zip

    基于java的开发源码-mina高性能Java网络框架.zip 基于java的开发源码-mina高性能Java网络框架.zip 基于java的开发源码-mina高性能Java网络框架.zip 基于java的开发源码-mina高性能Java网络框架.zip 基于java的开发...

    Could not resolve dependencies for project org.apache.hive:hive-exec:jar:2.3.0:

    hive 开发UDF 使用maven工程 引发jar包缺失 hive 开发UDF 使用maven工程 引发jar包缺失

    Mina长连接短连接实例

    它利用Java NIO库,实现了异步、非阻塞的通信模式,可以在单一线程中处理多个并发连接,大大提升了服务器的并发能力。Minaclient和MinaHost工程正是展示了如何在实际项目中应用这些概念。 在Minaclient工程中,我们...

    mina-filter-compression-2.0.7.jar

    mina-filter-compression-2.0.7.jar,mina 过滤器jar包,核心包之一

    Mina+Socket通信

    总的来说,Mina与Socket结合使用,可以构建出高效、灵活的网络通信解决方案。Mina的高级抽象简化了网络编程的复杂性,而Socket则提供了基础的网络通信能力。理解这两者的原理和用法,对于提升Java网络编程技能至关...

    apache-mina-2.0.16

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发服务器端和客户端的网络应用。标题"apache-mina-2.0.16"表明我们讨论的是...

    websocket+java服务器(mina)

    Mina(Java Multithreaded Network Application Framework)是一个用Java编写的网络应用框架,它提供了高度可扩展性和性能,适用于多种网络协议,包括TCP和UDP。Mina为开发者提供了一种抽象层,简化了网络编程的复杂...

    Java Netty技术研究

    远古: java.net + io java.net + iojava.net + java.iojava.net + java.iojava.net + java.iojava.net + java.iojava.net + java.io java.net + io java.net + io java.net + iojava.net + java.iojava.net + java....

    使用MINA实现长连接

    MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专门设计用于构建高性能、高可用性的网络应用程序,尤其适合TCP和UDP协议的长连接应用。它提供了异步I/O模型,可以处理大量的并发...

    mina core 包

    org.apache.mina.core.buffer.IoBuffer mina core 包

    mina-core-2.0.0-M1.jar和slf4j

    mina-core-2.0.0-M1.jar是Apache Mina项目的核心库,它是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务端和客户端应用程序。Mina提供了一种统一的API,可以处理多种传输协议,如TCP/IP、UDP/IP...

    apache-mina-2.1.3-bin.tar.zip

    Apache MINA是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个“apache-mina-2.1.3-bin.tar.zip”文件包含了Apache MINA的最新版本2.1.3,适用于Java开发者,便于...

    MINA_框架简介适合新手

    3. 高性能、高扩展性:MINA框架可以帮助开发者快速开发高性能、高扩展性的网络通信应用。 MINA框架的组成部分: 1. IoAcceptor:负责接受来自客户的请求。 2. IoProcessor:负责处理客户请求,定时检查客户是否有...

    java-mina通信框架详解.docx

    它提供了JAVA对象的序列化和虚拟机内部通信的功能,使得开发者能够迅速构建高性能、高可扩展性的网络应用。Mina的核心特性是其事件驱动、异步(基于Java NIO)的编程模型,使得处理网络通信变得更加高效。 Mina分为...

    基于Apache Mina实现的TCP长连接和短连接实例

    然而,频繁的短连接可能会增加握手和释放连接的开销,特别是在高并发场景下。 2. **TCP长连接**:在长连接中,一旦建立连接,就可以进行多次数据传输,直到连接的任意一方主动断开连接。这种模式适用于需要保持连续...

    高性能Java网络框架 MINA.7z

    MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。MINA由Apache软件基金会开发,并且是其顶级项目之一...

    mina连接 mina心跳连接 mina断线重连

    Apache Mina是一个开源的网络通信框架,常用于构建高性能、高效率的服务端应用程序,尤其在Java平台上。在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina...

Global site tag (gtag.js) - Google Analytics