我正在修改Java代码,看起来像这样 -
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(POST);
connection.setRequestProperty("Content-Type", CONTENT_TYPE);
connection.setReadTimeout(5 * 60 * 1000);
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.writeBytes(parameters);
wr.flush();
wr.close();
in = connection.getInputStream();
connection = null;
它适用于少量数据交换(包括并发请求)。 如果数据很大或存在并发请求(对于大数据),我会收到“java.net.SocketTimeoutException:Read timed out”错误。发生此错误后,程序无法读取其他数据或满足其他请求。我必须重新启动服务器(JBoss)。
我最初的想法是将setReadTimeOut增加到15.没有帮助,仍然会收到大型数据集的并发请求的错误。
我的其他选择是什么?我如何从读取超时错误中恢复?
上面的代码使用的是java.net。*。
感谢任何帮助.WM
答案 0 :(得分:-1)
我很确定它与您用来编写http请求正文的DataOutputStream有关。我从来没有见过有人用DataOutputStream做这件事。
DataOutputStream旨在将原始java类型(int,byte,long等)写入OutputStream。当您使用字符串进行处理时,它将占用每个字符(2个字节),并将其转换为字节,同时忽略字符的最高字节。
这可能适用于没有设置最高8位的某些字符,但肯定会迟早导致数据丢失。这可能导致发送一个http请求,该请求指定的内容长度与实际消息体的长度不同,这反过来会导致远程服务器等待更多永远不会被接收的数据。
我会将DataOutputStream替换为例如BufferedWriter,允许您编写字符数据。还要考虑使用apache的HttpClient,它比java的HttpUrlConnection复杂得多。
干杯, 汤姆