java - POST 大消息时 HttpUrlConnection#setReadTimeout 无效

标签 java httpclient

我遇到一个问题,我需要向其 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/

相关文章:

ios - Xamarin.Forms HttpClient 到 RESTful Web 服务

httpclient - 如何解决 WebAssembly 应用程序中与 HttpClient 相关的错误

java - 在 Java httpclient 中设置用户代理并允许重定向到 true

java - 赋值的左侧必须是变量

java - 从 CAMEL 中的 HTTP POST 请求流式传输到文件

java - 已编译的 lambda 函数中的额外参数从何而来?

java - CodeModel 修饰符顺序

java - 定时器在满足条件时给出错误

c# - 从 azure 函数调用 Web api 的最佳方法

web-services - 在 Spring 中发出 HTTP 请求的最简单方法