У меня проблема, когда внешний 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();