我已经在这个bug上工作了好几天了,无法解决它.
我写了一个HttpsURLConnection客户端来使用POST请求上传大文件(> 1GB).我还使用com.sun.net.httpserver.HttpServer实现了服务器端.由于文件很大,我必须在我的连接上使用:setFixedLengthStreamingMode/setChunkedStreamingMode设置(使用其中的任何一个来复制bug).请注意我也使用HTTPS连接进行上传.
我正在将文件同时上传到多个服务器(每个http客户端的单独线程,连接到不同的服务器).我已经设置了并发上传的限制,所以每次只有X个线程有一个打开的UrlConnection(错误是用X = [1..4]重现的).(其他线程在信号量上等待)
我的问题是这样的:当上传时间不到5分钟(准确度不到4:50分钟)时,一切正常.如果第一批线程需要超过5分钟才能完成,则会为每个活动线程抛出异常:
java.io.IOException:在sun.net.www.protocol.http.HttpURLConnection $ StreamingOutputStream.checkError(未知来源)sun.net.www.protocol.http.HttpURLConnection $ StreamingOutputStream.write(未知)将请求正文写入服务器时出错资源)
尝试写入HttpURLConnection输出流时抛出异常.[outputStream.write(缓冲液,0,LEN);]
下一批线程可以正常工作(即使它们需要超过5分钟).请注意,服务器完全相同,现在该过程不会失败,从而导致我认为问题不在服务器端.(如果是那么第二批也是假设在5分钟后失败......)
我在连接上有/没有连接/读取超时重现了这个问题.此外,在服务器端,我看到文件正在创建和增长,直到异常发生.客户端抛出异常大约20-40秒后,服务器将抛出IOException"读取超时".
我使用wireshark收集了一个TCP/IP示例,并且看到服务器在大约客户端异常时发送了一个FIN数据包,我不明白为什么.(所有连接似乎都在此之前运行)
我已经阅读了许多关于类似问题的线程,但找不到任何合适的解决方案.(包括使用java.net.URLConnection来触发和处理HTTP请求)
关于为什么会发生这种情况的任何想法?我怎样才能找到它的原因?我该如何解决?
非常感谢.
PS我没有发布代码,因为它很长......但如果它能帮助理解我的问题,我会很高兴这样做.