クライアントが大きなファイルを送信するときに、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 以降にはそのような構造はありません。