我正在修复一个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.*。
感谢任何help..WM
发布于 2012-08-07 04:41:44
我非常确定这与您用来编写http请求正文的DataOutputStream有关。我从来没有见过任何人用DataOutputStream做这件事。
DataOutputStream被设计为向OutputStream写入原始java类型(int、byte、long等)。当输入字符串时,就像您正在做的那样,它将获取每个字符(2个字节),并将其转换为一个字节,而忽略字符的最高字节。
这可能适用于一些没有设置最高8位的字符,但迟早会导致数据丢失。这随后可能导致发送http请求,该http请求指定与实际消息体的长度不同的内容长度,这又将导致远程服务器等待更多永远不会被接收的数据。
我会用BufferedWriter来代替DataOutputStream,它允许你写字符数据。还可以考虑使用apache的HttpClient,它比java的HttpUrlConnection复杂得多。
干杯,汤姆
https://stackoverflow.com/questions/11834236
复制相似问题