WriteListener (servlet 3.1) semantics



假设我正在向HttpServletResponse写入数据块。所以我的方法接收一个字节数组,我把它写到response.getOutputStream(),然后我释放线程。当我接收到另一个数据块时,我的方法将被唤醒,它将再次写入getOutputStream()。最后,我呼叫AsyncContext.complete()

现在,WriteListener.onWritePossible()规范说:

这个方法将在容器第一次被调用时被调用可以写入数据。容器随后将调用onWritePossible方法当且仅当isReady方法on下面描述的ServletOutputStream返回false。

似乎当容器调用此方法时,我已经需要在某个地方缓冲我的响应,因为onWritePossible()可能永远不会再次调用。因此,对于前面的示例,我需要将接收到的所有数据块写入缓冲区(一个字节数组,或者如果缓冲区足够大,可能是一个临时文件),如果在响应完成之前调用onWritePossible(),我该怎么办?阻塞线程,直到我有我所有的响应数据?

查看以下链接中的代码。可能不是确切的解决方案,但它的想法可以解决你的情况:Servlet 3.1 Async IO Echo

嗯…维护一个缓冲区似乎是

    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());
       }
    }

相关内容

  • 没有找到相关文章

最新更新