Http Server - Netty FileRegions是否可重用?

时间:2018-01-16 22:57:08

标签: java http server netty

我目前正在研究一个http服务器,有些事情表现得有些奇怪。 我想生成动态内容,也只是提供静态文件。 提供动态生成的内容可以正常运行。 由于我想从零拷贝中获利,我使用FileRegions来提供静态文件。 我的频道pipline包含以下处理程序(按此顺序):

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

    1. DefaultHttpReponse被写入ChannelHandlerContext。 DefaultHttpReponse不会被重用并包含标题 内容类型和内容长度
    2. 使用retain方法增加FileRegion的ReferenceCount。 然后使用FileRegion作为参数在ChannelHandlerContext上调用writeAndFlush。 对于返回的ChannelFuture,添加了一个ChannelFutureListener,它打印“DONE”。
    3. 第一个响应按预期工作,浏览器获取完整文件并正确显示并打印“DONE”。 但是如果再次调用“/”uri,则浏览器不会显示任何内容,只会永远加载但“DONE”会被打印出来。 然后在我重新启动服务器后,我使用telnet手动拨打电话。第一个响应是正确的,但后来我注意到第二个调用只返回一个标题,但没有内容。 “完成”仍然会被打印出来。

      所以我的问题:可以多次使用相同的FileRegion对象吗?我做错了吗?

1 个答案:

答案 0 :(得分:1)

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

此外,您需要确保在LastHttpContent之后发送FileRegion,否则当您编写第二个HttpResponseEncoderHttpResponse中的状态机将处于正确状态}}