大数据的HttpsURLConnection POST请求在几分钟后抛出IOException

时间:2012-03-20 14:56:07

标签: post tcp https httpurlconnection ioexception

我已经在这个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:将请求主体写入服务器时出错     at sun.net.www.protocol.http.HttpURLConnection $ StreamingOutputStream.checkError(Unknown Source)     at sun.net.www.protocol.http.HttpURLConnection $ StreamingOutputStream.write(Unknown Source)

尝试写入HttpURLConnection输出流时抛出异常。 [outputStream.write(缓冲液,0,LEN);]

下一批线程可以正常工作(即使它们需要超过5个 分钟)。 请注意,服务器完全相同,现在该过程不会失败,从而导致我认为问题不在服务器端。 (如果是那么第二批也假设在5分钟后也失败了......)

我在连接上有/没有连接/读取超时重现了这个问题。 此外,在服务器端,我看到文件正在创建和增长,直到异常发生。 客户端抛出异常大约20-40秒后,服务器将抛出IOException“读取超时”。

我使用wireshark收集了一个TCP / IP示例,并且看到服务器在大约客户端异常时发送了一个FIN数据包,我不明白为什么。 (所有连接似乎都在此之前起作用)

我已经阅读了很多关于类似问题的线程,但找不到任何合适的解决方案。 (包括Using java.net.URLConnection to fire and handle HTTP requests

关于为什么会发生这种情况的任何想法? 我怎样才能找到它的原因? 我该如何解决?

非常感谢。

P.S 我没有发布代码,因为它很长... 但如果能帮助理解我的问题,我将很乐意这样做。

0 个答案:

没有答案