我遇到一个问题,即我需要POST大型邮件的外部HTTP服务器出现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();
答案 0 :(得分:0)
看起来你正在打开一个连接并写入输出流....我认为混淆是阅读与写作的作用....当你的代码挂起时,你不是从输入流中读取的。 ..所以超时不会对挽救占领有任何影响..
如果有办法超时写作,你的代码可以这样修复。