2

HttpServletRequestを受け取ると、ServletInputStreamを取得し、リクエスト本文を1readLine行ずつ読み取ります。readLineここで、クライアントが非常に遅く、タイムアウト後に戻りたい場合はどうなるのだろうか。

TimerTaskおそらく、を に割り込ませてreadLineをキャッチするようにスケジュールできInterruptedExceptionます。それは理にかなっていますか?HTTP リクエスト本文をタイムアウトで読み取る別の解決策を提案していただけますか?

4

1 に答える 1

2

readLine の代わりに、ストリームからの独自の「タイトな」読み取り (小さな bufferSize 値、たとえば一度に 8 バイト) を実装し、反復内でタイムアウトをアサートすることができます。それ以外に、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 ....
于 2013-11-01T20:19:37.553 に答える