ServletOutputStream.isReady()
的javadoc说以下 :
返回:如果此ServletOutputStream的写会成功,否则返回false。
尽管该码头的的ServletOutputStream
实施, HttpOutput
似乎表现得相当混乱的情况下,当流处于CLOSED
状态。 它返回true
:
case CLOSED:
return true;
来源: HttpOutput.java:1011 。
此外,所有三个write
的方法HttpOutput
抛出EofException
时,它的CLOSED
:
case CLOSED:
throw new EofException("Closed");
如此看来,写绝不能得逞。 什么是这种行为背后的原因是什么?
关键的事实: 千钧一发意味着写入操作。
闭合内部状态指示流/输出的使用被关闭以该调度(不是流本身实际上被关闭)。
我们是如何陷入这种状态呢? 有什么东西触发ServletOutputStream.close()
反过来HttpOutput.close()
现在没有更多的允许写入从当前调度该流。
在闭合状态下时,发生齐平。
- 阿齐平将提交响应
- 阿齐平将完成写入的各种缓冲液存在于交换/连接/输出的各种层。
- 如果有一个集合缓存器(对于许多小型写入)写入了这一点。
- 如果有一个压缩层(gzip的)它将迫使冲洗从那里。
- 然后,所有这些缓冲区也经过
Transfer-Encoding
层(例如:分块)。 - 然后发生了网络写。
所述HttpOutput
也被输出的所有嵌套的请求,诸如使用一个点include()
从RequestDispatcher
这将重新打开HttpOutput
用于在使用期间将include()
然后再次将其关闭。
一旦HttpOutput
是充分和完全冲洗/完成(没有更多的调度,没有更多的写入等),则最终缓冲液冲洗完成后,转移编码完成时,HttpOutput复位,再循环,并返回到HttpConnection的使用下一个交换。
我们可以做javadoc'ing,在代码库,或至少使用常量和变量名更有意义的工作做得更好。
开业https://github.com/eclipse/jetty.project/issues/2687
关于码头EofException
(而不是JVM EOFException
上写)。
一旦ServletOutputStream
关闭进行具体的调度使用,进一步调用write()
将导致码头EofException
。
还有的味道EofException
,其中已提交的响应细节受到了侵犯。
例如:你宣布一个响应Content-Length
比如说40MB的,但写了41MB,就超过了承诺的响应的能力,这是一个IOException。 和Servlet规范告诉我们抛出一个IOException
在这种情况下。
码头将抛出码头内部EofException
(延伸IOException异常),以表示该特定方案和中止连接,打破你可能想任何连接持久。