刷新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);
    }
  1. 在刷新flush队列的时候,自旋写入数据到底层socket默认的16次后,会不会出现flushedEntry还是不为null的情况?也就是flush队列不会全部被写完?
  2. 为什么刷新完flush队列之后要调用clearOpWrite这个方法?这个方法是把SelectionKey关注事件改成了Write吗?

感谢回答!

写回答

1回答

闪电侠

2019-06-29

  1. clearOpWrite 表示 Netty 的缓冲区里面已经没有数据要写到操作系统底层了,所以selector不需要再关心write事件了;

  2. 后面的incompleteWrite(writeSpinCount < 0); 的逻辑可以分析一下:

//img.mukewang.com/szimg/5d16e2f90001af2917060722.jpg


//img.mukewang.com/szimg/5d16e3310001bb6926541814.jpg

1
1
Netty0
非常感谢!
2019-07-01
共1条回复

Java读源码之Netty深入剖析

解析netty各大组件细节,百万级性能调优,设计模式实际运用

2334 学习 · 283 问题

查看课程