当我收到HttpServletRequest时,我得到ServletInputStream并逐行读取请求正文readLine
。现在我想知道如果客户端非常慢并且我希望在readLine
超时后返回怎么办。
我可能可以安排 aTimerTask
来中断readLine
并赶上InterruptedException
. 是否有意义?您会建议另一种解决方案来读取超时的 HTTP 请求正文吗?
当我收到HttpServletRequest时,我得到ServletInputStream并逐行读取请求正文readLine
。现在我想知道如果客户端非常慢并且我希望在readLine
超时后返回怎么办。
我可能可以安排 aTimerTask
来中断readLine
并赶上InterruptedException
. 是否有意义?您会建议另一种解决方案来读取超时的 HTTP 请求正文吗?
您可以从流中实现自己的“紧密”读取(小的 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 ....