Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WriteListener(servlet 3.1)语义_Java_Servlets_Servlet 3.1 - Fatal编程技术网

Java WriteListener(servlet 3.1)语义

Java WriteListener(servlet 3.1)语义,java,servlets,servlet-3.1,Java,Servlets,Servlet 3.1,假设我正在将数据块写入一个HttpServletResponse。因此,我的方法接收一个字节数组,将其写入response.getOutputStream(),然后释放线程。当我收到另一块数据时,我的方法将被唤醒,它将再次写入getOutputStream()。最后,我调用AsyncContext.complete() 现在,WriteListener.onWritePossible()规范说明: 此方法将在第一次调用时由容器调用 可以写入数据。容器随后将调用 onWritePossible方法

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

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

此方法将在第一次调用时由容器调用 可以写入数据。容器随后将调用 onWritePossible方法当且仅当isReady方法处于启用状态 ServletOutputStream(如下所述)返回false


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

hmm。。维持一个缓冲区似乎是一种方法

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

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