1

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

4

1 に答える 1

1

これがバグではない場合、FixedRecvByteBufAllocator はバッファーを最大 1024 バイトに制限する必要があります。

于 2013-07-01T20:43:25.537 に答える