假设我正在向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());
}
}