服务背景:css
流数据接收--> 解析过滤-->调用socket服务 写入mina服务。
java
服务器异常日志:
web
java.io.IOException: Too many open files Failed to open a selectorFailed to create a new instance of org.apache.mina.transport.socket.nio.NioProcessor:null
定位到问题代码:
apache
public void init() { NioSocketConnector connector = new NioSocketConnector(); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.defaultCharset()))); connector.setConnectTimeoutMillis(10000); connector.setHandler(new SocketClientHandler()); connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小 connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小 ConnectFuture cf = connector.connect( new InetSocketAddress(socketConfig.getSocketServerIp(), socketConfig.getSocketServerPort())); // 等待链接建立完成 cf.awaitUninterruptibly(); session = cf.getSession(); }
问题产生缘由:
当mina服务端长时间链接不上 ,并发链接特别多的时候 都会致使上述问题。
解决方案:当链接不成功的时候 进行施放句柄。服务器
修改以后:
微信
public void init() { NioSocketConnector connector = new NioSocketConnector(); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.defaultCharset()))); connector.setConnectTimeoutMillis(10000); connector.setHandler(new SocketClientHandler()); connector.getSessionConfig().setReceiveBufferSize(10240); // 设置接收缓冲区的大小 connector.getSessionConfig().setSendBufferSize(10240);// 设置输出缓冲区的大小 ConnectFuture cf = connector.connect( new InetSocketAddress(socketConfig.getSocketServerIp(), socketConfig.getSocketServerPort())); // 等待链接建立完成 cf.awaitUninterruptibly(); if (cf.isDone()) { if (!cf.isConnected()) { log.error("fail connect {} {}", socketConfig.getSocketServerIp(), socketConfig.getSocketServerPort()); connector.dispose(); throw new RuntimeException("Not connect to Mina Server"); } else { session = cf.getSession(); } } }
持续分享我的的成长经历,但愿为你的职场发展带来些新思路,欢迎扫码关注我!session
你若喜欢,为小编点个在看哦 并发
本文分享自微信公众号 - 纯洁的明依(chenmingyi20181223)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。app