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 回答