HOSTPSURLConnection POST-запрос большого файла выдает IOException через несколько минут - PullRequest
7 голосов
/ 20 марта 2012

Я работаю над этой ошибкой уже несколько дней и не могу ее устранить.

Я написал клиент HttpsURLConnection для загрузки больших файлов (> 1 ГБ) с помощью запросов POST.Я также реализовал серверную часть, используя com.sun.net.httpserver.HttpServer.Поскольку файлы довольно большие, я должен использовать настройки: setFixedLengthStreamingMode / setChunkedStreamingMode для моего соединения (ошибка воспроизводится с использованием любого из них).Обратите внимание, что я также использую 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 (buffer, 0, len);]

Следующая партия потоков будет работать нормально (даже если она займет более 5 минут).Обратите внимание, что серверы полностью идентичны, и теперь процесс не завершится сбоем, что наводит меня на мысль, что проблема не в серверной части.(Если это было тогда, то вторая партия также должна была выйти из строя через 5 минут ...)

Я воспроизвел эту проблему с / без тайм-аутов соединения / чтения для соединения.Кроме того, на стороне сервера я видел, как файл создается и увеличивается, пока не произойдет исключение.Примерно через 20-40 секунд после того, как клиент сгенерирует исключение, сервер выдаст IOException «тайм-аут чтения».

Я собрал образец TCP / IP с помощью wireshark и увидел, что сервер отправляет мне пакет FIN примерно свремя исключения клиента, я понятия не имею, почему.(Кажется, до этого все соединения работали)

Я прочитал много тем по похожим вопросам, но не смог найти правильного решения.(включая Использование java.net.URLConnection для запуска и обработки HTTP-запросов )

Есть идеи, почему это происходит?Как я могу найти причину этого?Как я могу это решить?

Большое спасибо.

PS Я не публиковал код, потому что он довольно длинный ... Но если он поможет понять мою проблему, я буду радсделай так.

...