当客户端发送大文件时,如何限制 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 及更高版本中没有这样的构造。