WriteListener(servlet 3.1)语义

时间:2013-06-13 12:42:33

标签: java servlets servlet-3.1

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

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

  

第一次容器将调用此方法   可以写数据。容器随后会调用   onWritePossible方法当且仅当isReady方法打开时   ServletOutputStream(如下所述)返回false。

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

2 个答案:

答案 0 :(得分:1)

检查以下链接中的代码。可能不是确切的解决方案,但它的想法可以为您的案例提供解决方案: Servlet 3.1 Async IO Echo

答案 1 :(得分: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());
       }
    }