Java Apache Mina有太多打开文件错误的风险是什么?以及如何解决它?

时间:2014-03-18 18:48:51

标签: java apache-mina

我有一个使用Apache MINA编写的套接字应用程序,使用Linux OS,

这次我看到带有此代码的日志文件时出现了太多错误:

IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
acceptor.setCloseOnDeactivation(true);
acceptor.setHandler(new ChatHandler());
acceptor.getSessionConfig().setReadBufferSize(2);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
acceptor.bind(new InetSocketAddress(15000));

当我同时用2-3个客户端测试时,我收到了这个错误:

Caused by: java.io.IOException: Too many open files
at sun.nio.ch.IOUtil.makePipe(Native Method) ~[?:?]
at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:65) ~[?:?]
at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:36) ~[?:?]
at java.nio.channels.Selector.open(Selector.java:227) ~[?:?]
at org.apache.mina.transport.socket.nio.NioProcessor.<init>(NioProcessor.java:59) ~[MC.jar:?]

我用谷歌搜索了它,但是我不知道这个异常的风险是什么,这个错误会不会导致我的应用程序在事务中失败?

如果是,有人可以解释一下吗?以及如何解决它?

2 个答案:

答案 0 :(得分:3)

这可能是一个很大的问题。此错误(ENFILE)表示您或操作系统有太多打开的文件描述符。

stdin,stdout和stderr是文件描述符;任何打开的文件都是文件描述符;您创建的任何套接字也是文件描述符。

要知道您作为用户打开文件的限制,请执行以下操作:

ulimit -n

要了解操作系统的限制,请执行以下操作:

cat /proc/sys/fs/file-max

通常,用户限制就是问题。

您可以尝试使用以下方法提高限额:

ulimit -n <a greater number here>

但很可能它不起作用。您需要做的是编辑/etc/security/limits.conf,首选,在/etc/security/limits.d中创建一个具有相关名称的新文件,并添加以下两行:

theuser soft nofile <somelargenumber>
theuser hard nofile <somelargenumber>

请注意,要使这些限制生效,用户必须退出并重新登录;如果它是专用于系统服务的用户,则重新启动此服务即可。

此外,如果您知道运行应用程序的进程的PID,则可以通过发出命令来查看当前打开的文件描述符的数量:

ls /proc/<thepid>/fd|wc -l

如果内核限制是问题(非常不可能,但谁知道),那么您必须编辑/etc/sysctl.conf并更改proc.sys.fs.file-max条目,然后运行sysctl - 作为{ {1}}。

答案 1 :(得分:0)

我确定您不能调用连接器的dispose方法。

此方法关闭业务线程,方法是调用ExecuteService的shutdown方法。

同时将内部标志设置为标记为需要停止的连接器,worker thread停止此标志。