在netty 4 cr6中限制入站缓冲区的大小

时间:2013-06-29 06:02:46

标签: netty

当客户端发送大文件时,如何限制netty创建的入站缓冲区的大小?我希望客户端在ByteBuf已满时停止通过网络发送数据,并在准备好接收更多数据后恢复。

这是我的处理程序代码:

public class MyDecoder extends ChannelInboundHandlerAdapter {

@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
    // limit the size of recieving buffer to 1024
    ctx.channel().config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(1024));
    }

@Override public void messageReceived(ChannelHandlerContext ctx, MessageList<Object> msgs) throws Exception {
    ByteBuf byteBuf = msgs.<ByteBuf>cast().get(0);
    // stop after this line in debugger to check size of the actual payload per messageReceived invocation
    int bufferSize = byteBuf.readableBytes();
    }
}

现在假设在我的测试中我写道:

EmbeddedChannel ch = new EmbeddedChannel(new MyDecoder());
ch.writeInbound(Unpooled.wrappedBuffer(<<<here is a byte representation of a large file, say 100 mb>>>));
ch.readInbound(); // etc... 

现在,在调试器中,我到了计算bufferSize的行,我总是得到我的大文件的完整大小。 FixedRecvByteBufAllocator在此时唯一的区别是当它的大小设置为0时 - 所有其他值产生相同的结果。

在netty 4 cr2中有一个用于此目的的方法newInboundBuffer,但是在cr6及之后没有这样的构造。

1 个答案:

答案 0 :(得分:1)

如果不是这样的错误,那么FixedRecvByteBufAllocator应该将缓冲区限制为最大1024字节。