POST POST大邮件时,HttpUrlConnection#setReadTimeout无效

时间:2011-10-10 15:36:28

标签: java httpclient

我遇到一个问题,即我需要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();

1 个答案:

答案 0 :(得分:0)

看起来你正在打开一个连接并写入输出流....我认为混淆是阅读与写作的作用....当你的代码挂起时,你不是从输入流中读取的。 ..所以超时不会对挽救占领有任何影响..

如果有办法超时写作,你的代码可以这样修复。