首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >isReady()在封闭状态下返回true -为什么?

isReady()在封闭状态下返回true -为什么?
EN

Stack Overflow用户
提问于 2018-06-29 11:49:27
回答 1查看 410关注 0票数 0

javadoc说

返回:如果对此ServletOutputStream的写入成功,则为true,否则返回false。

尽管Jetty的ServletOutputStream实现,但当流处于CLOSED状态时,HttpOutput的行为似乎相当混乱。它返回true

代码语言:javascript
运行
复制
case CLOSED:
    return true;

资料来源:HttpOutput.java:1011.

此外,write中的三种HttpOutput方法都会在HttpOutputCLOSED时抛出EofException

代码语言:javascript
运行
复制
case CLOSED:
    throw new EofException("Closed");

因此,写作似乎是不可能成功的。这种行为背后的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-29 13:29:41

关键事实:一个亲密的调用意味着一个写操作。

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

我们是怎么进入这种状态的?某些东西触发了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()的进一步调用将导致JettyEofException

还有一种EofException风格,您提交的响应细节被违反了。

例:您声明响应Content-Length为40 an,但是编写了41 an,超出了提交响应的能力,这是一个IOException。Servlet规范告诉我们在本例中抛出一个IOException

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51101088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档