Java HttpUrlConnection#setReadTimeout在发布大型邮件时无效

Java HttpUrlConnection#setReadTimeout在发布大型邮件时无效,java,httpclient,Java,Httpclient,我有一个问题,需要向其发布大型消息的外部HTTP服务器存在OutOfMemory问题。我的HTTP客户端代码没有超时。 通过使用kill-STOP暂停HTTP服务器进程(要撤消,请使用kill-CONT),可以重现这种行为 我发现,使用下面的代码,如果我将请求保持较小,则整个消息都会写入输出流,并且getResponseCode超时 对于下面这样的大消息,代码在写入到输出流时绑定在一起。我假定我已填充套接字缓冲区。这样代码就不会超时 我要寻找的是一种在编写请求时控制超时的方法 我使用Apache

我有一个问题,需要向其发布大型消息的外部HTTP服务器存在OutOfMemory问题。我的HTTP客户端代码没有超时。 通过使用kill-STOP暂停HTTP服务器进程(要撤消,请使用kill-CONT),可以重现这种行为

我发现,使用下面的代码,如果我将请求保持较小,则整个消息都会写入输出流,并且getResponseCode超时

对于下面这样的大消息,代码在写入到输出流时绑定在一起。我假定我已填充套接字缓冲区。这样代码就不会超时

我要寻找的是一种在编写请求时控制超时的方法

我使用ApacheHttpClient尝试了类似的方法,得到了类似的结果。 我尝试在另一个线程中运行下面的Java代码,并亲自中断,但该线程仍在运行

我需要保持流行为,但我希望有任何关于如何让客户端代码超时的想法

谢谢

PJ

URL=新URL(“http://unresponsive/path");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setDoInput(真);
连接设置输出(真);
conn.SETUSECHACHES(假);
连接设置连接超时(10000);
连接设置固定长度流模式(4*1000000);
conn.setRequestProperty(“内容长度”,“4000000”);
连接设置读取超时(10000);
conn.setRequestMethod(“POST”);
OutputStream os=conn.getOutputStream();
对于(int i=0;i<1000000;i++){
如果(i%1000==0){
System.out.println(“写入:+i”);
}
写(“test”.getBytes(“us ascii”);
}
os.close();
System.out.println(“响应代码:+conn.getResponseCode());
InputStream is=conn.getInputStream();
InputStreamReader isr=新的InputStreamReader(is);
BufferedReader br=新的BufferedReader(isr);
弦线;
而((line=br.readLine())!=null){
系统输出打印项次(行);
}
is.close();

您似乎正在打开一个CNConnection并写入输出流。。。。我认为困惑在于阅读与写作的角色。。。。当代码挂起时,您不是从输入流读取。。。因此,超时将不会对挽救捆绑产生任何影响


如果有一种方法可以使写入超时,那么您的代码可以通过这种方法修复。

谢谢jayunit100。我知道读取超时应该只适用于响应的读取,但是没有设置写入超时的方法。我已经设置了连接超时,但这也没有帮助。
        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();