0

我正在修复 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:读取超时”错误。在此错误之后,程序无法读取其他数据或满足其他请求。我必须重新启动服务器(JBoss)。

我最初的想法是将 setReadTimeOut 增加到 15。没有帮助,对于大型数据集的并发请求仍然会出错。

我还有哪些其他选择?如何从读取超时错误中恢复?

上面的代码使用 java.net.*。

感谢任何帮助..WM

4

1 回答 1

-1

我很确定这与您用来编写 http 请求正文的 DataOutputStream 有关。我从未见过有人用 DataOutputStream 做这件事。

DataOutputStream 旨在将原始 Java 类型(int、byte、long 等)写入 OutputStream。当输入一个字符串时,就像你正在做的那样,它将获取每个字符(2 个字节),并将其转换为一个字节,同时忽略字符的最高字节。

这可能适用于一些没有设置最高 8 位的字符,但迟早肯定会导致数据丢失。这可能会导致发送一个 http 请求,该请求指定的内容长度与实际消息体的长度不同,这反过来又会导致远程服务器等待更多永远不会收到的数据。

我会将 DataOutputStream 替换为例如 BufferedWriter,它允许您写入字符数据。还可以考虑使用 apache 的 HttpClient,它比 java 的 HttpUrlConnection 复杂得多。

干杯,汤姆

于 2012-08-06T20:41:43.590 回答