吃透Netty源码系列五十九之AbstractUnsafe和AbstractNioUnsafe
AbstractUnsafe的方法
beginRead开始读
判断下条件,准备开始读,真正读的是通道的doBeginRead方法。
@Override
public final void beginRead() {
assertEventLoop();
if (!isActive()) {
return;
}
try {
doBeginRead();
} catch (final Exception e) {
invokeLater(new Runnable() {
@Override
public void run() {
pipeline.fireExceptionCaught(e);
}
});
close(voidPromise());
}
}
write写数据到出站缓冲区
这个以前讲过,就是write操作最后就是写入出站缓冲区。如果出站缓冲区关闭了,那就无用写了,释放消息即可,否则就封装后放入出站缓冲区里,里面是个单链表。
@Override
public final void write(Object msg, ChannelPromise promise) {
assertEventLoop();
ChannelOutboundBuffer outboundBuffer = this.outboundBuffer;
if (outboundBuffer == null) {
ReferenceCountUtil.release(msg);
return;
}
int size;
try {
msg = filterOutboundMessage(msg);//封装成直接缓冲区
size = pipeline.estimatorHandle().size(msg);//获取缓冲区大小
if (size < 0) {
size = 0;
}
} catch (Throwable t) {
safeSetFailure(promise, t);
ReferenceCountUtil.release(msg);
return;
}
outboundBuffer.addMessage(msg, size, promise);//往出站缓冲区添加消息
}
flush准备将出站缓冲区数据发出去
给出站缓冲区数据打好冲刷标记,然后准备冲刷flush0。
@Override
public final void flush() {
assertEventLoop();
ChannelOutboundBuffer outboundBuffer = this.outboundBuffer;
if (outboundBuffer == null) {
return;
}
outboundBuffer.addFlush();
flush0();
}
flush0将出站缓冲区数据发出去
具体的发送方法,主要是调用通道的doWrite方法,里面才是将数据从通道中发出去。
protected void flush0() {
if (inFlush0) {
//避免重入
return;
}
final ChannelOutboundBuffer outboundBuffer = this.outboundBuffer;
if (outboundBuffer == null || outboundBuffer.isEmpty()) {

本文深入剖析Netty中的AbstractUnsafe和AbstractNioUnsafe类,详细解读beginRead、write、flush等核心方法的实现原理,以及NioUnsafe接口的使用,为理解Netty的I/O操作提供关键洞察。
最低0.47元/天 解锁文章
2120

被折叠的 条评论
为什么被折叠?



