的isReady()在关闭状态返回true - 为什么?(isReady() returns tr

2019-10-30 08:51发布

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");

如此看来,写绝不能得逞。 什么是这种行为背后的原因是什么?

Answer 1:

关键的事实: 千钧一发意味着写入操作。

闭合内部状态指示流/输出的使用被关闭以该调度(不是流本身实际上被关闭)。

我们是如何陷入这种状态呢? 有什么东西触发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异常),以表示该特定方案和中止连接,打破你可能想任何连接持久。



文章来源: isReady() returns true in closed state - why?