java isReady()在关闭状态下返回true为什么?
^{
Returns: true if a write to this ServletOutputStream will succeed, otherwise returns false.
尽管Jetty实现了ServletOutputStream
,但在流处于CLOSED
状态的情况下HttpOutput
的行为似乎相当混乱。它返回true
:
case CLOSED:
return true;
资料来源:HttpOutput.java:1011
此外,HttpOutput
中的所有三个write
方法在CLOSED
时抛出EofException
:
case CLOSED:
throw new EofException("Closed");
因此,似乎写作永远不会成功。这种行为背后的原因是什么
# 1 楼答案
关键事实:关闭调用意味着写操作
CLOSED internal状态表示流/输出的用法对该分派是关闭的(而不是流本身实际上是关闭的)
我们是怎么进入这种状态的?有东西触发了
ServletOutputStream.close()
(反过来HttpOutput.close()
),现在不允许从当前调度对该流进行更多写入在关闭状态下,发生冲洗
Transfer-Encoding
层(例如:分块)李>HttpOutput
也是所有嵌套请求的一个输出点,例如使用来自RequestDispatcher
的include()
,它将重新打开HttpOutput
,以便在include()
期间使用,然后再次关闭它一旦
HttpOutput
被完全刷新/完成(不再有调度、写入等),那么最终的缓冲区刷新完成,传输编码完成,HttpOutput被重置、回收,并返回到HttpConnection以供下一次交换使用我们可以在代码库中更好地使用javadoc,或者至少使用更有意义的常量和变量名
已打开https://github.com/eclipse/jetty.project/issues/2687
关于Jetty
EofException
(而不是JVMEOFException
)的写操作一旦
ServletOutputStream
被关闭以便在特定调度上使用,对write()
的进一步调用将导致一个JettyEofException
还有一种
EofException
的味道,你的承诺响应细节被违反了例如:您声明了一个响应
Content-Length
,比如说40MB,但写了41MB,超出了提交的响应的能力,这是一个IOException。Servlet规范告诉我们在这种情况下抛出一个IOException
Jetty将抛出Jetty internal
EofException
(它扩展了IOException),以指示此特定场景并中止连接,从而中断您可能想要的任何连接持久性