我遇到一个问题,我需要向其 POST 大消息的外部 HTTP 服务器出现内存不足问题。我的 HTTP 客户端代码没有超时。 可以通过使用kill -STOP 暂停HTTP 服务器进程来重现此行为(要撤消,请使用kill -CONT )。
我发现使用下面的代码,如果我将请求保持较小,则整个消息都会写入输出流,并且 getResponseCode 会超时。
对于像下面这样的大消息,代码会绑定(bind)到输出流的写入中。我认为我已经填满了套接字缓冲区。这样代码就永远不会超时。
我正在寻找的是一种在写入请求时控制超时的方法。
我使用 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();
最佳答案
看来您正在打开一个连接并写入输出流...我认为混淆在于读取与写入的角色...当您的代码挂起时,您不是从输入流读取。 ..所以超时不会对挽救僵局产生任何影响..
如果有办法使写入超时,您的代码就可以通过这种方式修复。
关于java - POST 大消息时 HttpUrlConnection#setReadTimeout 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7715224/