如何使用超时读取HttpServletRequest数据?

时间:2013-08-31 19:08:28

标签: java servlets httprequest inputstream

当我收到HttpServletRequest时,我会ServletInputStream并逐行阅读请求正文readLine。现在我想知道如果客户端非常慢并且我希望readLine在超时后返回。

我可以安排TimerTask来中断readLine并抓住InterruptedException。是否有意义?你会建议另一种解决方案来读取超时的HTTP请求体吗?

1 个答案:

答案 0 :(得分:2)

您可以从流中实现自己的“紧密”读取(小的bufferSize值,例如每次8个字节)而不是readLine,并在迭代中断言您的超时。 除此之外,当您阻止IO时(在下面的示例中的in.read调用中被阻止),您无法做很多事情。当线程在IO上被阻塞时,它不会对中断作出反应。

long timeout = 30000l; //30s
int bufferSize = 8;
ByteArrayOutputStream out = new ByteArrayOutputStream(bufferSize);
try {
    long start = System.currentTimeMillis();
    int byteCount = 0;
    byte[] buffer = new byte[bufferSize];
    int bytesRead = -1;
    while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
        byteCount += bytesRead;
        if (System.currentTimeMillis() > start + timeout) {
            //timed out: get out or throw exception or ....
        }
    }
    out.flush();
    return byteCount;
} ... catch ... finally ....