为什么DataInputStream.readFully(...)挂起了?

时间:2017-02-14 20:42:27

标签: java http stream

我很难理解我的应用程序出了什么问题。下面显示的是第一次成功执行的代码(先前HttpResponse,然后是第二次调用,挂起dataInputStream.readFully(...)行。

doSomething(HttpResponse response) {
    HttpEntity responseBody = response.getEntity();
    long len = responseBody.getContentLength();
    byte[] payload = new byte[(int)len]; // <-- I've confirmed this is the correct length

    DataInputStream d = null;
    try {
        InputStream bais = responseBody.getContent();
        d = new DataInputStream(bais); 
        d.readFully(payload); // <-- *** HANGS HERE! ***

        EntityUtils.consume(responseBody);
        ...
    } finally {
        if (d != null) {
            IOUtils.closeQuietly(d);
        }
    }
}

在阻止/挂起10秒以上后,应用程序超时并且调用线程被拆除。

  • 我检查了response对象,并确认其内容长度符合预期。
  • 在阅读DataInputStream Javadoc
  • 时,没有任何事情发生
  • 通过我们的提交历史记录,我注意到引入了IOUtils.closeQuietly(...)电话。 [相信我在这里:]很难跟踪我们的集成系统此应用程序的初始失败,因此我无法确认此finally块是否引入了任何意外行为。据我所知,调用closeQuietly()有推荐的方法。

更新:为清楚起见,此代码是执行HTTP RANGED GET请求的应用程序的一部分。例如,首先response从字节0开始下拉 N 字节。第二个调用GET下一个 N 字节。该文件很大,因此有两个以上必要的RANGED GET。

0 个答案:

没有答案