Netty:如何重用相同的“FullHttpResponse”?

Netty: How can I reuse the same `FullHttpResponse`?

在我的项目中,我想为许多客户编写相同的 FullHttpResponse 以提高性能。

之前我也写过同样的ByteBuf自定义协议,用retain防止写入后buf被释放

不幸的是 FullHttpResponse (DefaultFullHttpResponse) 我的技术似乎不起作用。我第一次写响应客户端正确收到响应,但下一次写不通过。

我做了一个简单的 System.out.println 测试以确保没有任何阻塞并且我的代码已完全执行,我的测试表明是的,没有任何阻塞并且请求似乎确实通过了。

我正在使用 Maven Central 的 Netty 4.1.0.Final 版本。


管道只有一个 HttpServerCodec(256, 512, 512, false, 64) 和我的 SimpleChannelInboundHandler<HttpRequest>,我从中发送 FullHttpResponse

这是我的入站处理程序的简化版本:

class HTTPHandler extends SimpleChannelInboundHandler<HttpRequest> {

    private static final FullHttpResponse response =
            new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, 
                                        HttpResponseStatus.OK,
                                        Unpooled.buffer(8).writeLong(0),
                                        false);

    @Override
    public void channelRead0(ChannelHandlerContext ctx, HttpRequest msg) {
        ctx.writeAndFlush(response.retain(), ctx.voidPromise());
    }

}

你需要使用 response.duplicate().retain() 或者如果使用 Netty 4.1.x 你也可以使用 response.retainedDuplicate().

这是确保您获得单独的 reader/writer 索引所必需的。