java - Http 服务器 - Netty FileRegions 是否可重用?

标签 java http server netty

我目前正在一个 http 服务器上工作,有些事情的表现有点奇怪。 我想生成动态内容并且只提供静态文件。 提供动态生成的内容毫无问题。 由于我想从零复制中获利,因此我使用 FileRegions 来提供静态文件。 我的 channel pipline 包含以下处理程序(按此顺序):

  1. HttpRequestDecoder
  2. HttpResponseEncoder
  3. HttpObjectAggregator
  4. ApiMapper

ApiMapper 是可共享的,并且派生自 SimpleInboundHandler。 创建时,ApiMapper 从静态文件创建 FileRegion。 现在每次请求“/” uri 时都会发生这种情况:

  1. DefaultHttpReponse 被写入 ChannelHandlerContext。 DefaultHttpReponse 不会被重用,并且包含以下 header 内容类型和内容长度
  2. 使用其保留方法可以增加 FileRegion 的 ReferenceCount。 然后在 ChannelHandlerContext 上调用 writeAndFlush,并以 FileRegion 作为参数。 返回的 ChannelFuture 中添加了一个 ChannelFutureListener,它打印“DONE”。

第一个响应按预期工作,浏览器获取完整文件并正确显示它,并打印“DONE”。 但是,如果再次调用“/”uri,浏览器不会显示任何内容,只会永远加载,但会打印“DONE”。 然后,在我重新启动服务器后,我使用 telnet 手动调用电话。第一个响应是正确的,但后来我注意到第二个调用仅返回 header ,但没有内容。 仍然会打印“DONE”。

所以我的问题:同一个 FileRegion 对象可以多次使用吗?我还做错了什么吗?

最佳答案

不,您不能通过这种方式多次写入相同的 FileRegion,因为 transferred 状态会在 DefaultFileRegion 对象上更新。您需要为此处的每次写入创建一个新的 DefaultFileRegion 实例。

此外,您还需要确保在 FileRegion 之后发送 LastHttpContent,否则 HttpResponseEncoder 中的状态机将不会处于正确的位置编写第二个 HttpResponse 时的状态。

关于java - Http 服务器 - Netty FileRegions 是否可重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48291160/

相关文章:

java - 扫描仪正在创建 NoSuchElementException 错误,我不明白为什么

java - Google App Engine 中的非规范化?

java - Spring Boot - 没有这样的列异常

Java 正则表达式 : Remove Everything After Last Instance Of Character

java - Apache commons NET FTP 检索在文件读取后不工作

c# - 如何为 HTTP 基本身份验证配置 app.config?

performance - 现代浏览器是否仍然限制并行下载?

http - 当我使用浏览器冲浪时需要一个方便的工具来捕获 HTTP 响应

linux - 设置要在启动时执行的命令+设置每天重启-Ubuntu(关闭)

ubuntu - 将文件从我的电脑上传到 ubuntu 服务器