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

Java Http服务器-Netty FileRegions是否可重用?,java,http,server,netty,Java,Http,Server,Netty,我目前在一个http服务器上工作,有些事情表现得有点奇怪。 我想生成动态内容,也只是提供静态文件。 为动态生成的内容提供服务是没有问题的。 因为我想从零拷贝中获利,所以我使用FileRegions来服务静态文件。 My channel pipline包含以下处理程序(按此顺序): HttpRequestDecoder HttpResponseEncoder HttpObjectAggregator ApiMapper ApiMapper是可共享的,并派生自SimpleInboundHandler

我目前在一个http服务器上工作,有些事情表现得有点奇怪。 我想生成动态内容,也只是提供静态文件。 为动态生成的内容提供服务是没有问题的。 因为我想从零拷贝中获利,所以我使用FileRegions来服务静态文件。 My channel pipline包含以下处理程序(按此顺序):

  • HttpRequestDecoder
  • HttpResponseEncoder
  • HttpObjectAggregator
  • ApiMapper
  • ApiMapper是可共享的,并派生自SimpleInboundHandler。 创建时,ApiMapper从静态文件创建一个FileRegion。 现在,每次请求“/”uri时,都会发生以下情况:

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


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

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


    另外,您需要确保在
    文件区域
    之后发送
    LastHttpContent
    ,否则在编写第二个
    HttpResponseEncoder
    时,
    HttpResponse

    中的状态机将不会处于正确状态,因此我可以重用LastHttpContent.EMPTY\u LAST\u内容?在发送之前我是否必须增加引用计数?是否最好创建一个直接ByteBuf,将文件内容存储在其中并重用它,然后每次创建一个新的DefaultFileRegion?我目前的应用程序时间不多,负载也不重,但我对未来的项目很好奇。