7

適切な切断コールバックがないため、応答への書き込みを試みました。

private boolean write(byte[] output, AsyncContext context) {
    try {
        OutputStream stream  = context.getResponse().getOutputStream();
        stream.write(output);
        stream.flush();
        return true;
    } catch (IOException ex) {
        //client disconnected
        log.error(ex);
        removeAsyncContext(context);
        return false;
    }

}

しかし、これはうまくいかなかったようです。クライアントが切断されている場合、バッファの書き込みとフラッシュは例外をスローしませんでした

奇妙なことに、2 回目に出力ストリームに書き込もうとすると (切断後)、書き込みによって例外がスローされます。初めて書き込み/フラッシュしたように見えますが、通知せずに一部の内部状態がエラーに設定されています。

Jetty 8 と Tomcat 7 の両方で試しましたが、同じ動作が見られます。

クライアントがメッセージを受信したかどうかを確認する解決策はありますか? 何か不足していますか?

4

2 に答える 2

0

私の経験では、クライアントがサーブレットから切断されると、壊れたパイプを参照する例外が発生します。

例: ServletOutputStream にバイトを書き込むときにパイプが壊れる

java.net.SocketException をキャッチし、例外の詳細を調べて、パイプが壊れているかどうかを確認することをお勧めします (出発点として)。

Caused by: ClientAbortException:  java.net.SocketException: Broken pipe
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:354)
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381)
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
于 2013-04-08T12:47:31.500 に答える