Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java应用程序在打开套接字时立即抛出ClosedByInterruptException,原因是什么?_Java_Sockets_Exception_Interrupted Exception - Fatal编程技术网

Java应用程序在打开套接字时立即抛出ClosedByInterruptException,原因是什么?

Java应用程序在打开套接字时立即抛出ClosedByInterruptException,原因是什么?,java,sockets,exception,interrupted-exception,Java,Sockets,Exception,Interrupted Exception,我有一个java应用程序,它可以打开到一个地址的许多连接,可能一次就在2000年的大概范围内,几乎没有任何活动,主要是为了监控目的而打开的,偶尔传递几个字节。当需要打开新连接时,它会自动打开它们并将它们添加到其池中。但有时,由于未知原因,应用程序在创建远程地址的套接字期间/之后会立即收到ClosedByInterruptException。据我所知,这只发生在客户端,是线程的中断信号的结果。我已经反复检查了问题区域周围的源代码,看起来还可以。我希望我能得到某人的专业知识,看看除了源代码之外,是否

我有一个java应用程序,它可以打开到一个地址的许多连接,可能一次就在2000年的大概范围内,几乎没有任何活动,主要是为了监控目的而打开的,偶尔传递几个字节。当需要打开新连接时,它会自动打开它们并将它们添加到其池中。但有时,由于未知原因,应用程序在创建远程地址的套接字期间/之后会立即收到ClosedByInterruptException。据我所知,这只发生在客户端,是线程的中断信号的结果。我已经反复检查了问题区域周围的源代码,看起来还可以。我希望我能得到某人的专业知识,看看除了源代码之外,是否还有其他原因,例如,是否有系统原因导致这种情况?有硬件原因吗?服务器级/路由器级?我的网络知识我会考虑业余爱好者,但是2K连接对于路由器来说太多了,或者没有?

INFO  [08 Sep 2011 23:11:45,982]: Reconnecting id 20831
ERROR [08 Sep 2011 23:11:45,990]: IOException while creating plain socket channel
java.nio.channels.ClosedByInterruptException
    at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184)
    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:518)
    at com.*.createSocketChannelPlain(MyTask.java:441)
    at com.*._executeTask(MyTask.java:176)
    at com.*.executeTask(MyTask.java:90)
    at com.*.ThreadPool$WorkerThread.run(ThreadPool.java:55)
ERROR [08 Sep 2011 23:11:45,990]: Could not open socket
WARN  [08 Sep 2011 23:11:45,990]: WorkerThread_24 received interrupted exception in ThreadPool
java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)
    at com.*.TaskQueue.getTask(TaskQueue.java:39)
    at com.*.ThreadPool$WorkerThread.run(ThreadPool.java:48)
更新:我想尽我所能帮助他人做出诊断。这里是发生异常的实际函数,唯一的区别是添加到第441行的行标记

private SocketChannel createSocketChannelPlain() throws TaskFailedException {
    SocketChannel socketChannel = null;
    try {
        // Create a non-blocking socket channel to use to communicate for imap connection
        socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(false);
        try {socketChannel.socket().setSoLinger(true, 0);} catch (Exception e) {}
        try {socketChannel.socket().setKeepAlive(true);} catch (Exception e) {}
        /*Line 441*/ socketChannel.connect(new InetSocketAddress(_HOSTNAME, _PORT));
        //System.out.println("Started connection");

        // Complete connection
        while (!socketChannel.finishConnect()) {
            // do something until connect completed
            try {
                //do what you want to do before sleeping
                Thread.sleep(500);//sleep for 500 ms
                //do what you want to do after sleeping
            } catch(InterruptedException ie){
                //If this thread was interrupted by another thread 
                try { socketChannel.close(); } catch (Exception e) {}
                finally { socketChannel = null; }
                break;
            }
        }
        //System.out.println("Finished connecting");

        return socketChannel;
    } catch (IOException e) {
        logger.error("IOException while creating plain socket channel to gmail", e);
        try { socketChannel.close(); } catch (Exception e1) {}
        finally { socketChannel = null; }
        //throw new TaskFailedException("IOException occurred in createSocketChannel");
    }
    return socketChannel;
}

你在什么操作系统上运行这个?我不知道Windows,但在Linux和其他类似Unix的操作系统上,如果有大量套接字,可能会耗尽文件句柄。在运行Java应用程序之前,您可以通过执行ulimit-n8192或类似操作来解决这个问题。或者,编辑/etc/security/limits.conf并设置nofile。所有这些都表明,ClosedByInterruptedException会以一种奇怪的方式注意到这一点


如果以上不是问题所在,那么下一步我会尝试运行tcpdump,如果我们谈论的是一台没有GUI的机器,或者我们不是,并捕获您的程序生成的流量,寻找连接启动时发生的奇怪事情。

您在什么操作系统上运行此功能?我不知道Windows,但在Linux和其他类似Unix的操作系统上,如果有大量套接字,可能会耗尽文件句柄。在运行Java应用程序之前,您可以通过执行ulimit-n8192或类似操作来解决这个问题。或者,编辑/etc/security/limits.conf并设置nofile。所有这些都表明,ClosedByInterruptedException会以一种奇怪的方式注意到这一点


如果以上不是问题所在,那么下一步我会尝试运行tcpdump,如果我们谈论的是一台没有GUI的机器,或者我们不是,并捕获程序生成的流量,寻找连接启动时发生的奇怪事情。

这是linux,Debian。实际上,我以前遇到过文件描述符问题,而我经常收到的异常描述是错误的主机名。从那以后,我设置了启动脚本,以大幅提高限制。tcpdump实际上是一个很棒的主意,我还没有尝试过。结果是sysadmin不允许我tcpdump它…以后必须在个人系统上尝试。或者,如果你给他命令,他可能会帮你做?tcpdump-i any-s0-w/tmp/casey.pcap端口80大概是对的,我猜?也许加上谷歌的网络和你的源IP作为限制,以避免丢弃任何其他人的流量…@casey,你有什么收获吗?如果你有结果的话,我会对结果感兴趣的。我从未有过这种特殊的效果,但我们操作一些做类似事情的系统…在Mac OS上使用launchctl-它是linux,Debian。实际上,我以前遇到过文件描述符问题,而我经常收到的异常描述是错误的主机名。从那以后,我设置了启动脚本,以大幅提高限制。tcpdump实际上是一个很棒的主意,我还没有尝试过。结果是sysadmin不允许我tcpdump它…以后必须在个人系统上尝试。或者,如果你给他命令,他可能会帮你做?tcpdump-i any-s0-w/tmp/casey.pcap端口80大概是对的,我猜?也许加上谷歌的网络和你的源IP作为限制,以避免丢弃任何其他人的流量…@casey,你有什么收获吗?如果你有结果的话,我会对结果感兴趣的。我从未有过这种特殊的效果,但我们操作的一些系统做类似的事情…在Mac OS上使用launchctl-