刷新Flush队列,写入数据到Socket底层过程中的小问题
来源:9-5 刷新buffer队列

Netty0
2019-06-25
坐标:#io/netty/channel/nio/AbstractNioByteChannel.java#doWrite()
Netty-version : 4.1.37.Final
@Override
protected void doWrite(ChannelOutboundBuffer in) throws Exception {
int writeSpinCount = config().getWriteSpinCount();
do {
Object msg = in.current();
if (msg == null) {
// Wrote all messages.
// 这个方法有什么用吗?
clearOpWrite();
// Directly return here so incompleteWrite(...) is not called.
return;
}
writeSpinCount -= doWriteInternal(in, msg);
// 这里只做默认16次的flush写入操作?
} while (writeSpinCount > 0);
incompleteWrite(writeSpinCount < 0);
}
- 在刷新flush队列的时候,自旋写入数据到底层socket默认的16次后,会不会出现flushedEntry还是不为null的情况?也就是flush队列不会全部被写完?
- 为什么刷新完flush队列之后要调用clearOpWrite这个方法?这个方法是把SelectionKey关注事件改成了Write吗?
感谢回答!
写回答
1回答
-
clearOpWrite 表示 Netty 的缓冲区里面已经没有数据要写到操作系统底层了,所以selector不需要再关心write事件了;
后面的incompleteWrite(writeSpinCount < 0); 的逻辑可以分析一下:
112019-07-01
相似问题