AdaptiveRecvByteBufAllocator 决定了要分配的ByteBuf的容量。
RecvByteBufAllocator
public interface RecvByteBufAllocator { //创建一个新的句柄。句柄提供实际操作并保留内部信息,这是预测最佳缓冲区容量所必需的。 Handle newHandle(); @Deprecated interface Handle { //创建一个新的接收缓冲区,其容量可能足够大以读取所有入站数据,而又很小以不浪费其空间。 ByteBuf allocate(ByteBufAllocator alloc); //与{@link #allocate(ByteBufAllocator)}类似,除了它不分配任何内容,仅告诉容量。 int guess(); //重置所有已累积的计数器,并建议下一个读取循环应读取多少消息/字节。 //{@link #continueReading()}可以使用它来确定读取操作是否应该完成。(这只是一个提示,可能会被实现忽略。) void reset(ChannelConfig config); //增加当前读取循环已读取的消息数。 void incMessagesRead(int numMessages); //设置上一次读取操作已读取的字节。这可用于增加已读取的字节数。 void lastBytesRead(int bytes); //获取上一次读取操作的字节数。 int lastBytesRead(); //设置读取操作将尝试读取或读取的字节数。 void attemptedBytesRead(int bytes); //获取读取操作将(或确实)尝试读取的字节数。 int attemptedBytesRead(); //确定当前的读取循环是否应该继续。 boolean continueReading(); //读取已完成。 void readComplete(); } @SuppressWarnings("deprecation") @UnstableApi interface ExtendedHandle extends Handle { //与{@link Handle#continueReading()}相同,只是“更多数据”由供应商参数确定。 boolean continueReading(UncheckedBooleanSupplier maybeMoreDataSupplier); } }
MaxMessagesRecvByteBufAllocator
public interface MaxMessagesRecvByteBufAllocator extends RecvByteBufAllocator { //返回每个读取循环要读取的最大消息数。 int maxMessagesPerRead(); //设置每个读取循环读取的最大消息数。如果此值大于1,则事件循环可能会尝试多次读取以获取多条消息。 MaxMessagesRecvByteBufAllocator maxMessagesPerRead(int maxMessagesPerRead); }
DefaultMaxMessagesRecvByteBufAllocator
public abstract class DefaultMaxMessagesRecvByteBufAllocator implements MaxMessagesRecvByteBufAllocator { //默认为1 private volatile int maxMessagesPerRead; //默认为true private volatile boolean respectMaybeMoreData = true; //构造方法 public DefaultMaxMessagesRecvByteBufAllocator() { this(1); } //构造方法 public DefaultMaxMessagesRecvByteBufAllocator(int maxMessagesPerRead) { maxMessagesPerRead(maxMessagesPerRead); } @Override public int maxMessagesPerRead() { return maxMessagesPerRead; } @Override public MaxMessagesRecvByteBufAllocator maxMessagesPerRead(int maxMessagesPerRead) { checkPositive(maxMessagesPerRead, "maxMessagesPerRead"); this.maxMessagesPerRead = maxMessagesPerRead; return this; } public DefaultMaxMessagesRecvByteBufAllocator respectMaybeMoreData(boolean respectMaybeMoreData) { this.respectMaybeMoreData = respectMaybeMoreData; return this; } public final boolean respectMaybeMoreData() { return respectMaybeMoreData; } }
静态内部类 MaxMessageHandle
public abstract class MaxMessageHandle implements ExtendedHandle { private ChannelConfig config; //每次循环读取的最大消息数 private int maxMessagePerRead; //循环读取的消息总数 private int totalMessages; //循环读取的字节总数 private int totalBytesRead; //每次循环期望读取的字节数 private int attemptedBytesRead; //上次循环读取的字节数 private int lastBytesRead; //默认为true private final boolean respectMaybeMoreData =