6

にデータのチャンクを書き込んでいるとしましょうHttpServletResponse。したがって、私のメソッドはバイト配列を受け取り、それを に書き込みresponse.getOutputStream()、スレッドを解放します。データの別のチャンクを受け取ると、メソッドが起動され、getOutputStream()再び書き込みが行われます。最後に、私は に電話しAsyncContext.complete()ます。

さて、WriteListener.onWritePossible()仕様には次のように書かれています:

このメソッドは、データの書き込みが初めて可能になったときにコンテナーによって呼び出されます。以下で説明する ServletOutputStream の isReady メソッドが false を返す場合にのみ、コンテナはその後 onWritePossible メソッドを呼び出します。

コンテナがこのメソッドを呼び出すとき、onWritePossible()二度と呼び出されない可能性があるため、応答をどこかにバッファリングする必要があるようです。したがって、前の例では、受け取ったデータのすべてのチャンクをバッファー (バイト配列、またはバッファーが十分に大きい場合は一時ファイル) に書き込む必要がありonWritePossible()、応答が完了する前に が呼び出された場合はどうすればよいですか?そうです?応答データがすべて揃うまでスレッドをブロックしますか?

4

2 に答える 2

1

次のリンクでコードを確認してください。正確な解決策ではないかもしれませんが、あなたの場合の解決策になる可能性があります: Servlet 3.1 Async IO Echo

于 2015-12-26T06:45:53.393 に答える
0

うーん..バッファを維持することが方法のようです

    public void onWritePossible() throws IOException {
       doWrite();  
    }

    // this is some callback where you received next chunk of data
    public void onMoreDataReceived(byte[] data) {
      putDataToBuffer(data);
      doWrite();
    }

    // this method is non-blocking
    private void synchronized doWrite() throws IOException {
       while (_servletOutputStream.isReady() && hasMoreDataInBuffer()) {
         _servletOutputStream.write(getMoreBytesFromBuffer());
       }
    }
于 2015-02-12T01:16:02.063 に答える