java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
看了下netty 源代碼,?終于明白了
Channel.write()?和?ChannelHandlerContext.write()?的區(qū)別了
網(wǎng)上說的都不是很清楚
首先注明我的netty版本
```
io.netty
netty-all
4.0.36.Final
```
ChannelPipeline處理ChannelHandler的順序:
pipeline中的handler 處理的請求分為兩類: 讀 和 寫
對于讀請求 : 從handler鏈表的 head ?到 ?tail ? ? 挨個的處理, 跳過 ChannelOutboundHandler
對于寫請求 : 從handler鏈表的?tail ? ? ?到 ?head?挨個的處理, 跳過 ChannelInboundHandler
1 調(diào)用?Channel.write(), 會直接調(diào)用ChannelPipeline.write()
public?ChannelFuture?write(Object?msg)?{
return?pipeline.write(msg);
}
public?ChannelFuture?write(Object?msg,?ChannelPromise?promise)?{
return?pipeline.write(msg,?promise);
}
public?ChannelFuture?writeAndFlush(Object?msg)?{
return?pipeline.writeAndFlush(msg);
}
public?ChannelFuture?writeAndFlush(Object?msg,?ChannelPromise?promise)?{
return?pipeline.writeAndFlush(msg,?promise);
}
而ChannelPipeline.write() 直接調(diào)用 tail指向的 最后一個handler的 write[java]?view plain?copy
public?ChannelFuture?write(Object?msg)?{
return?tail.write(msg);
}
@Override
public?ChannelFuture?write(Object?msg,?ChannelPromise?promise)?{
return?tail.write(msg,?promise);
}
可以看到 調(diào)用的是ctx.prev獲取前一個, 所以寫從tail到head
2 調(diào)用ChannelHandlerContext.write()
首先通過findContextOutbound找到當(dāng)前ChannelHandlerContext的上一個OutboundContext
再調(diào)用它執(zhí)行具體的寫入邏輯
private?void?write(Object?msg,?boolean?flush,?ChannelPromise?promise)?{
AbstractChannelHandlerContext?next?=?findContextOutbound();
EventExecutor?executor?=?next.executor();
if?(executor.inEventLoop())?{
next.invokeWrite(msg,?promise);
if?(flush)?{
next.invokeFlush();
}
}?else?{
AbstractWriteTask?task;
if?(flush)?{
task?=?WriteAndFlushTask.newInstance(next,?msg,?promise);
}??else?{
task?=?WriteTask.newInstance(next,?msg,?promise);
}
safeExecute(executor,?task,?promise,?msg);
}
}
private?AbstractChannelHandlerContext?findContextOutbound()?{
AbstractChannelHandlerContext?ctx?=?this;
do?{
ctx?=?ctx.prev;
}?while?(!ctx.outbound);
return?ctx;
}
結(jié)論:
Channel.write() ?: ? ? ? ? ? ? ? ? ? ? ? ?從 tail 到 head 調(diào)用每一個outbound 的?ChannelHandlerContext.write
ChannelHandlerContext.write() : 從當(dāng)前的Context, 找到上一個outbound, 從后向前調(diào)用?write
總結(jié)
以上是生活随笔為你收集整理的java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中注解的解析_全面解析Java中
- 下一篇: java什么是静态_什么是java静态