亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Mina 高并發短連接導致java.io.IOException: To

系統 2331 0

轉自: http://xmdxzyf.iteye.com/blog/1698819

?

這幾天在解決一個用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 查看同一個進程允許的最大文件句柄數),則拋出異?!癹ava.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 高并發短連接導致java.io.IOException: Too many open files解決方案


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人a毛片手机免费播放 | 91免费精品国自产拍在线不卡 | 调教师鞭打总裁奴男男 | 亚洲国产精品高清在线一区 | 免费刺激性视频大片区 | 香蕉国产在线 | 91色综合久久 | 久久国产精品国产自线拍免费 | 91精品国产美女福到在线不卡 | 狠狠色伊人亚洲综合第8页 狠狠色综合久久丁香婷婷 狠狠色综合久久婷婷 | 爱爱网网站免费观看 | 香蕉人精品视频多人免费永久视频 | 毛片大全| 婷婷四房综合激情五月性色 | 成人欧美视频在线看免费 | 老子影院午夜 | 色天使色婷婷丁香久久综合 | 视频在线观看91 | 特级一级全黄毛片免费 | 久草视频免费在线播放 | 四虎影视www四虎免费 | 午夜日韩在线 | 亚洲精品乱码久久久久久 | 欧美日韩国产人成在线观看 | 99精品网 | 国产久热精品 | 日日噜噜噜夜夜爽爽狠狠图片 | 麻豆69 | a级毛片视频 | 依人成人综合网 | 国产欧美亚洲另类第一页 | 精品亚洲一区二区三区在线播放 | 日韩国产欧美视频 | 久久久久久国产精品免费 | 日韩欧美国产偷亚洲清高 | 三极毛片 | 久久午夜激情 | 日韩精品一区二区三区四区 | 国产精品一区三区 | 国产精品一区在线播放 | 久久九九精品视频 |