在我的项目中,我想为许多客户编写相同的FullHttpResponse,以提高性能。
以前,我为自定义协议编写了相同的ByteBuf,并使用retain来防止在编写后释放buf。
不幸的是,使用FullHttpResponseDefaultFullHttpResponse)我的技术似乎不起作用。第一次写入响应时,客户端会正确接收响应,但下一次写入不会完成。
我做了一个简单的System.out.println测试,以确保没有任何东西被阻塞,并且我的代码被完全执行,我的测试显示,是的,没有任何东西被阻塞,请求似乎确实通过了。
我用的是maven central的netty4.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()
这是确保获得单独的读写器索引所必需的。

09-27 02:13