HttpUrlConnection # setReadTimeout не действует при размещении больших сообщений - PullRequest
2 голосов
/ 10 октября 2011

У меня проблема, когда внешний HTTP-сервер, к которому мне нужно POST-сообщение большого размера, испытывает проблемы с OutOfMemory.Мой код HTTP-клиента не истекает.Можно воспроизвести это поведение, используя kill -STOP, чтобы приостановить процесс HTTP-сервера (чтобы отменить, используйте kill -CONT).

Я обнаружил, используя приведенный ниже код, что если я оставлю свой запрос небольшим,все сообщение записывается в выходной поток и время ожидания getResponseCode.

При большом сообщении, подобном приведенному ниже, код связывается при записи в выходной поток.Я предполагаю, что я заполнил буфер сокета.Код никогда не истекает.

То, что я ищу, - это способ контроля времени ожидания при написании запроса.

Я пробовал нечто подобное с использованием Apache HttpClient и получил аналогичный результат.Я попытался запустить приведенный ниже код Java в другом потоке и прервать его сам, но поток продолжает работать.

Мне нужно сохранить потоковое поведение, но я был бы признателен за любые идеи о том, как я мог бы получить клиентакод для тайм-аута.

Спасибо,

PJ

        URL url = new URL("http://unresponsive/path");
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setConnectTimeout(10000);
        conn.setFixedLengthStreamingMode(4 * 1000000);
        conn.setRequestProperty("Content-Length", "4000000");
        conn.setReadTimeout(10000);
        conn.setRequestMethod("POST");
        OutputStream os = conn.getOutputStream();
        for(int i = 0; i < 1000000; i++) {
            if(i % 1000 == 0) {
                System.out.println("write: " + i);
            }
            os.write("test".getBytes("us-ascii"));
        }
        os.close();
        System.out.println("response-code: " + conn.getResponseCode());
        InputStream is = conn.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while((line = br.readLine()) != null) {
            System.out.println(line);
        }
        is.close();

1 Ответ

0 голосов
/ 10 октября 2011

Похоже, что вы открываете соединение и записываете в поток вывода .... Я думаю, что путаница заключается в роли чтения против записи .... Вы не читаете из потока ввода, когда ваш код зависает. .. так что тайм-аут не будет иметь никакого эффекта, чтобы спасти связь ..

Если есть способ прервать запись, ваш код можно исправить таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...