큰 메시지를 POST해야하는 외부 HTTP 서버에 OutOfMemory 문제가있는 경우 문제가 있습니다. 내 HTTP 클라이언트 코드가 시간 초과되지 않습니다. kill -STOP을 사용하여 HTTP 서버 프로세스를 일시 중지 (실행 취소, kill -CONT 사용)하여이 동작을 재현 할 수 있습니다.큰 메시지를 게시 할 때 HttpUrlConnection # setReadTimeout은 아무 효과가 없습니다.
전체 메시지가 출력 스트림에 기록되고 getResponseCode가 시간 초과되는 요청을 작게 유지하면 아래 코드를 사용하는 것으로 나타났습니다.
아래와 같은 큰 메시지가 표시되면 코드는 출력 스트림에 대한 쓰기 작업을 수행합니다. 나는 소켓 버퍼를 채웠다 고 추정한다. 그런 다음 코드는 절대로 시간 초과되지 않습니다.
내가 찾고있는 것은 요청을 작성할 때 시간 제한을 제어하는 방법입니다.
나는 Apache HttpClient를 사용하여 비슷한 것을 시도해보고 비슷한 결과를 얻었다. 아래의 자바 코드를 다른 스레드에서 실행 해 보았습니다.하지만이 스레드는 스스로 중단되었지만 스레드는 계속 실행 중입니다.
나는 스트리밍 동작을 유지할 필요가 있지만 클라이언트 코드가 시간 초과 될 수있는 방법에 대해 어떤 아이디어라도 감사 할 것입니다.
감사합니다,
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();
감사합니다. jayunit100. 읽기 타임 아웃은 응답 읽기에만 적용되어야하지만 쓰기 타임 아웃을 설정하는 방법은 없다는 것을 알고 있습니다. 연결 시간 제한을 설정했지만이 방법도 도움이되지 않습니다. –