有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java isReady()在关闭状态下返回true为什么?

^{} javadoc says the following

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) 个答案

  1. # 1 楼答案

    关键事实:关闭调用意味着写操作

    CLOSED internal状态表示流/输出的用法对该分派是关闭的(而不是流本身实际上是关闭的)

    我们是怎么进入这种状态的?有东西触发了ServletOutputStream.close()(反过来HttpOutput.close()),现在不允许从当前调度对该流进行更多写入

    在关闭状态下,发生冲洗

    • 同花顺将提交响应
    • 刷新将完成对交换/连接/输出的各个层上存在的各种缓冲区的写入
    • 如果有一个聚合缓冲区(用于许多小的写操作),它会将其写出来
    • 如果有一个压缩层(gzip),它也会从那里强制刷新
    • 然后,所有这些缓冲区也会经过Transfer-Encoding层(例如:分块)
    • 然后发生网络写入

    HttpOutput也是所有嵌套请求的一个输出点,例如使用来自RequestDispatcherinclude(),它将重新打开HttpOutput,以便在include()期间使用,然后再次关闭它

    一旦HttpOutput被完全刷新/完成(不再有调度、写入等),那么最终的缓冲区刷新完成,传输编码完成,HttpOutput被重置、回收,并返回到HttpConnection以供下一次交换使用

    我们可以在代码库中更好地使用javadoc,或者至少使用更有意义的常量和变量名

    已打开https://github.com/eclipse/jetty.project/issues/2687

    关于Jetty EofException(而不是JVM EOFException)的写操作

    一旦ServletOutputStream被关闭以便在特定调度上使用,对write()的进一步调用将导致一个Jetty EofException

    还有一种EofException的味道,你的承诺响应细节被违反了

    例如:您声明了一个响应Content-Length,比如说40MB,但写了41MB,超出了提交的响应的能力,这是一个IOException。Servlet规范告诉我们在这种情况下抛出一个IOException

    Jetty将抛出Jetty internal EofException(它扩展了IOException),以指示此特定场景并中止连接,从而中断您可能想要的任何连接持久性