NIO连接丢失的无响应问题

时间:2019-12-16 09:34:36

标签: java nio

我正在经历一些在我们的环境中无法重现的场景。

我们的一位客户尝试连接到我们的服务器时,在该工作环境中发生随机崩溃。 我只是向您提供他们所面临问题的相关代码。

请先查看以下代码。

   readSelector = Selector.open();
        writeSelector = Selector.open();

        final Thread reader = new Thread("transport_rx") { //frozen
                @Override
                public void run() {
                    try {
                        if(readSelector.isOpen()) {
                            transport_rx(readSelector);
                        }
                    } catch (Throwable ex) {
                        try {
                            log.log(Level.SEVERE, "transport_rx thread exception", ex); //frozen
                        } finally {
                            System.exit(3);
                        }
                    }
                }
            };

        reader.setDaemon(true);
        reader.start();


 public void transport_rx(final Selector selector) throws IOException {


      // Some code

            synchronized (readInfos) {
                if (!readInfos.isEmpty()) {
                    for (final ChannelInfo info : readInfos) {
                        final SelectionKey clientKey = info.tp.clientChannel.register(selector, SelectionKey.OP_READ);
                        clientKey.attach(info);

                        info.setSelectionKey(clientKey);
                    }

                    readInfos.clear();
                }
            }

            // some code
}   

客户抱怨由于CloseChannelException导致系统退出,这可能是由于行"info.tp.clientChannel.register(selector, SelectionKey.OP_READ);"

但是崩溃不是很频繁,但是有时会在2-3天后发生。

因此,为了解决此问题,我们提供了try-catch子句来处理此问题。

请在下面找到修改后的代码。

synchronized (readInfos) {
            if (!readInfos.isEmpty()) {
                for (final ChannelInfo info : readInfos) {
                    /*
                     * final SelectionKey clientKey = info.tp.clientChannel.register(selector,
                     * SelectionKey.OP_READ); clientKey.attach(info);
                     * 
                     * info.setSelectionKey(clientKey);
                     */
                    try {
                     final SelectionKey clientKey = info.tp.clientChannel.register(selector, SelectionKey.OP_READ);
                     clientKey.attach(info);
                     info.setSelectionKey(clientKey);

                   } catch (final ClosedChannelException cce) {
                       info.tp.me_transport_close();// for closing the connection and restablishing it in few mins
                       //log.warning("Trying to read from a closed channel"); //frozen
                       //log.log(Level.FINEST, "Data read from a closed channel", cce); //frozen
                   }
                }

                readInfos.clear();
            }
        }

此后,没有崩溃问题,但他们抱怨客户在5到6天后变得无响应。 我们尽了一切努力来理解原因,但是由于在我们的环境中它是不可复制的,因此我们无法弄清。 但是我们的资源之一声称有时会丢失连接,我们可以看到有时会出现一些捷径,例如1或2次ping无法通过FileServer。

有人可以帮助我知道这是否是没有反应的原因吗?

是否可以通过上面的代码来处理或确认它?

0 个答案:

没有答案