当客户端发送大文件时,如何限制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及之后没有这样的构造。
答案 0 :(得分:1)
如果不是这样的错误,那么FixedRecvByteBufAllocator应该将缓冲区限制为最大1024字节。