<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前文傳送門 Netty分散式server啟動流程
final ChannelFuture initAndRegister() { Channel channel = null; try { //建立channel channel = channelFactory.newChannel(); //初始化channel init(channel); } catch (Throwable t) { //忽略非關鍵程式碼 } ChannelFuture regFuture = config().group().register(channel); //忽略非關鍵程式碼 return regFuture; }
簡單回顧上一小節內容, 我們跟完了建立channel的步驟, 知道了Netty的NioServerSocketChannel和jdk的ServerSocketChannel之間的關係, NioServerSocketChannel和jdk的channel是組合關係, 在其父類別AbstractChannel中有jdk的channel的一個成員變數, 通過建立netty的channel為jdk的channel賦值
我們繼續往下看init(Channel)方法
因為是ServerBootstrap物件呼叫的init()方法, 所以我們跟到ServerBootstrap類的init()方法中:
void init(Channel channel) throws Exception { //獲取使用者定義的選項(1) final Map<ChannelOption<?>, Object> options = options0(); synchronized (options) { channel.config().setOptions(options); } //獲取使用者定義的屬性(2) final Map<AttributeKey<?>, Object> attrs = attrs0(); synchronized (attrs) { for (Entry<AttributeKey<?>, Object> e: attrs.entrySet()) { @SuppressWarnings("unchecked") AttributeKey<Object> key = (AttributeKey<Object>) e.getKey(); channel.attr(key).set(e.getValue()); } } //獲取channel的pipline(3) ChannelPipeline p = channel.pipeline(); //work執行緒組(4) final EventLoopGroup currentChildGroup = childGroup; //使用者設定的Handler(5) final ChannelHandler currentChildHandler = childHandler; final Entry<ChannelOption<?>, Object>[] currentChildOptions; final Entry<AttributeKey<?>, Object>[] currentChildAttrs; //選項轉化為Entry物件(6) synchronized (childOptions) { currentChildOptions = childOptions.entrySet().toArray(newOptionArray(childOptions.size())); } //屬性轉化為Entry物件(7) synchronized (childAttrs) { currentChildAttrs = childAttrs.entrySet().toArray(newAttrArray(childAttrs.size())); } //新增伺服器端handler(8) p.addLast(new ChannelInitializer<Channel>() { //初始化channel @Override public void initChannel(Channel ch) throws Exception { final ChannelPipeline pipeline = ch.pipeline(); ChannelHandler handler = config.handler(); if (handler != null) { pipeline.addLast(handler); } ch.eventLoop().execute(new Runnable() { @Override public void run() { pipeline.addLast(new ServerBootstrapAcceptor( currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs)); } }); } }); }
初看起來程式碼好長, 其實並不複雜, 這裡對每一步進行一個簡述:
步驟(1), (2)是獲取的使用者程式碼中定義的選項和屬性
步驟(3)是獲取channel的pipeline, 這個channel就是上一小節我們學習建立的NioServerSocketChannel, 我們知道每個channel都有個pipeline的屬性, 是AbstractChannel的成員變數, 而這裡的pipeline()就是獲取其與channel繫結的pipeline, 這個pipline, 會在後面的章節中講到
步驟(4)是獲取worker執行緒組, 我們知道這個worker執行緒組就是在使用者程式碼中建立的NioEventLoopGroup, 後來在ServerBootstrap的group()方法中賦值為ServerBootstrap的成員變數, 而這裡是獲取其成員變數, 並賦值到區域性變數currentChildGroup中, NioEventLoop相關知識會在後面的章節講到
步驟(6), (7)是將選項和屬性轉化成Entry物件
步驟(8)是新增伺服器端Handler, 是通過和channel繫結的pipeline呼叫addLast()方法進行新增, 傳入一個ChannelInitializer類的子類物件, 至於addLast方法是做什麼的, ChannelInitializer是做什麼的, 後緒章節都會給大家詳細剖析, 這裡不必深究
這一小節我們瞭解了有關channel初始化的過程, 我們目前只需瞭解其大概步驟, 有關addLast的邏輯會在後面的章節進行詳細剖析
以上就是Netty啟動流程伺服器端channel初始化原始碼分析的詳細內容,更多關於Netty啟動流程伺服器端channel初始化的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45