00:00
我们再来看一下China handle context的作用和它设计。首先先来看它的一张图,从这里我们可以看出来,首先它是个接口。然后呢,这个接口它继承了outbound invoer,还有这个attribute map,以及什么呢,China。Inbound in worker,那说明什么呀?那说明他其实既可以处理我们入站的啊,出站的调度,也可以处理我们入站的调度。那现在我们来看一下。往下看。它的部分源码我们先看一下。China outbound invoer和China inbound invoer的部分源码我们先看一下,在这里,从这里我们可以看出来呢,它下面是有相应的一些方法的,对不对,那我们来分析一下,这边呢,也有看,这边叫做China outund in worker,有大量的方法,那我们来整理一下。这两个evoer就是针对入站或者出站方法来的。
01:02
就是在入站或者出战的handler的外层,在多包装一层,达到在方法前后的在什么达到在方法前后拦截并做一些特定操作的目的。他就是干这个事情的。好,我们再来看一下China handle contact的部分源码。这是他的一系列的方法啊,我们来看一下China handle呢,不仅啊,不仅仅是这写错了,是。不仅仅继承了他们。他们两个的方法同时也定定义了自己的一些方法,那哪些方法呢?这些方法能够获取contact上下文中对应啊中对应的,比如说China,就是执行器handler,还有pipeline内存分配器关联的handler。还有contact呢?Contact就是包装了handler的一切,以便contact可以在拍中方便的操作handler,这点大家明白,这是它的一个大致的流程。那现在呢,我们。
02:04
呃,因为因为这个我们所说的China contact,我们在前面已经通过第bug看看过很多遍了,这里呢,我就不去再去看它的源码了,我们来看一下这三者他们创建的过程,大家认真看看一下,就说China paperline,还有handler,还有China handler contacts这三个它是怎么一步一步创建起来的呢?我们来看。首先我准备从三个步骤来分析他们创建的过程,刚才呢,我们实际是一个静态的阅读源码的过程,现在我们来看一下它是如何创建的,看首先我看它这样的任何一个China PA,呃,China soet呢,创建时都会创建一个pipeline,刚才已经说过了,还有当用户或系统内部调用拍PEI的什么方法时。添加一个handle的时候呢,就会创建一个包装该handle的一个contact,这点是不是已经说过了,而且context呢,在拍line形成了双向的链表,那现在我们先来看第一个soet创建时,怎么创建这个pipeline呢?来注意听讲,就这块呢,我们来分析一下它在哪一句话创建起来的,找到它的源码。
03:14
在China的抽象附类有个叫obstract,有一个构造方法,这里面有一句话在这里。六看这里面啊,它在这面有个拍等于六,这这个地方显的是应该是一个空格号六。那我们来看一下这个操作,呃,不,它可能就是一个方法。直接调用的,那我们来看看这句话在哪里发生的呢,同学们。我们打开源码来追。回到这边来。我们直接就找到这句话。各位。把名称写到这里来定位了,现在呢,直接打开。同学们看到。
04:02
双击这就来了,大家有没有发现在这里面呢?它执行了这样一个方法,叫new China pipeline,也就是说我们在整个这个过程中拍line,真正的创建是在这个位置产生的,那我下个断点。来给大家玩一把,同样好。各位,我先来进一个debug,把刚才的这个debug先去掉一下。我们刚才不是在第八个吗。第八个已经是不是停止了。来吧,我们再次进一个debug。跑起来,我们看看端这个就是断点会不会放到这个位置。好,来了,大家看,此时此刻,我们这个拍拍是空的。大家看到没有,现在这个pipeline是一个空的,那下面这个new China pipeline会做什么事情呢?我们往下面debug一下,我们一一边第bug一边分析。第八个下可以看到代码会执行到这里,然后继续我们追踪到这个方法里面去,来我们看一下怎么进到这个方法啊,它核心的方法是这个叫debt全日排PE烂我们注意一下。
05:09
追进去。大家看在这里面呢,溜了一个,这边他溜了一个default China paperline,但是他首先要去把这个this拿到,所以说我再往里面追的时候呢,他会追到这个位置来。那我要我要返回,返回完了后再追才进到这个方法里面去,能理解这个大家看来家到这了,叫at China paperline,那这里面他做什么事情了呢?来给大家看一下。大家看到在这个时候,我们China还是一个空的,对,所以说其实它真正的创建呢,还要往下面继续来追踪,接着往下看。接着往下看。就这来了,我们看这一方是怎么形成的,很关键的一句话,走。诶,我怎么跳出来了,再进去啊,再进去。
06:02
再进去。诶,这怎么。不好意思啊,可能刚才有个断点,有一个按钮快捷键按错了,我们再重新来一下,我要追到这个方法里面去才行的,我才能看到他是怎么把这一个channel。给创建起来的。好,我们现在来分析哈。现在我们在分析什么?先说清楚,我们现在在分析。分析这个步骤就是怎么创建China,呃,这个pipeline就是China pipeline。呃,进去。再进去。好的,那再返回。再进去。到这来了,那我现在直接把这点放这就行了。然后就装到这,哎,直接到这来就可以了,大家看到这个地方时呢,这个圈链现在还是个空的,往下走一步往下走一步来。
07:00
到这来了,到这来过后呢,同学们看这个China呢,其实现在已经有看到没有,这个时候China就是我们的什么China呢。大家看一下啊,断点放这就是n IO server socket没问题吧。就是这个时候,我们NL server short就创建起来了,那创建起来过后,它下面还做了很多工作,他产生了两个异步的对象,一个是success future future,还有一个。Promise这两个呢,根据我这边的分析,他还产生了两个什么样来看。创建了一个future promise,用于我们的异步回调使用。那下面还有两个非常重要的动作,我们知道整个这个China排放单呢,它有。他最终是不是还有这两个特别重要的东西诶。他是不是还有一个害的。还有一个tale。那么这个head和ta在哪,在哪创建的呢?也就是在这个方法里面创建的,大家往下走。
08:00
走起来,大家看此时此刻这个tell。现在是个空的吧。他创建那个t contact,我们是不是在前面已经追过这个这个代码了,往下再走,T现在就有了。创先他先创建的T,再创建这个head head现在也是应该是个空的,再往下走一步,创建起来了,创建起来了过后呢,这两个要连接起来。也就是说现在这个。我们的hide。和我们的这一个T,它怎么把它关,把它形成一个双向链表呢?大家看它的代码head.next指向T。pi.pre指向害的。大家有没有发现,这就形成了最初始的。我们的这一个China nine的双线列表。那后面你再进行这个爱的方法操作的时候呢,诶,他再根据你的实际情况是加到这个T的。前边还是加到head的后边。但也有可能是加到我们,嗯,某一个handle的中间,也是有可能的。
09:04
这就是在这个地方,就把我们这所谓的China paperline的最最初的两个两一个T,一个head创建起来,并且形成了最初始的。双向列表。没问题吧,好,这个地方我们就过了。接着继续往下看。嗯,大家看到他创建了一个inbound t contact。嗨,创建了一个既是英镑的类,又是outbound的hi。Context这个high context它其实是什么呢?是兼顾两者,它既有英棒的特点,又有auto棒的特点,大家可以在这呢看一下。他内心是什么?来看这一,如果往这往这个追,往里面去追的话,你会看到一个hide hide contact,我们来看一下源码。Hide。Context。
10:00
好,来到了吧。大家看hycon,你们有没有发现它其实是auto,它继承了autound handler,还继承了in handler,因此我们说整个这个拍PE烂的头,它其实既可以处理入站的,又可以处理出站的,大家明白这思这现在大家理理解了为什么?我们原先的这个整个操作害的地方都可以处理啊。对,那么再回到这边来,再回到这边来,我们看T呢。T是个什么呢?它是t contact,我们也来看他是一个什么样的情况。Tell。Tell。Context。但是注意,其实它也是属于一个内部的类,大家可以看到它是什么样,它是一个inbo的。那最后呢,它将两个context相互连接,形式双线链表。这里我们说的t context和head context非常重要,所有的拍on呢的事件都会流进他们。
11:06
最后我们再来看爱的方法,爱的方法在添加处理器的时候呢,是创建contact的,它是怎么创建起来的呢?是不是这段代码我们在前面已经分析过了。就在调爱的方法的时候呢,它有这么一个动作,大家看一下。ADD last,爱last呢,往下走,往下走追到这个往下追,往里面追的时候呢,会追到这个代码来,Last在这里面它会new一个context。然后at last。对不对,但是大家有没有发现这段代码呢?他是做了一个什么呀,处理的synchronized。为什么要做这样处理呢?大家看我的代码说明。Pipeline添加到handler piline添加handler参数是线程词,Name是空,Handler是我们或者是系统传入的handle德ni为了防止多线程导致安全。
12:00
安全问题。它同步了这段代码及。Synchronized。他同步了这段代码。接着继续往下分析,检查这个handle的实力是否共享,如果不是,并且已经被别的拍拍使用了,就抛出异常。是不是还有个检查的,检查的机制。然后呢,他在调用一个new control,在这里呢,它会创建这个control。哎,这个counter呢,就跟你传入到handle关联起来了。也就是说,呃,我们可以这样理解,每次添加一个handle,就会创建一个关联的contact,然后调用last的方法将这个contact追加到列表里面去。这个我就不说了吧,这个就是找到他的。就是最后那一个把它加进去。如果这个通道还没有注册这个sector,就会就将这个content添加到这个pipeline代办任务里面去,当注册好了以后,就会调用call。Can I iid0这个方法,这个方法其实默认什么都不做,用户可以自己实现这个方法,同学们可以去往下,往下面去追下。
13:07
大家看真正是要在这里做这个处理的,看到没有。Call handler added。这个方法。接着呢,我们来看。继续往下看,到这个位置的时候,就分析到这个位置,这三个对象都已经创建好了,是不是我们所说的回顾一下我们说拍。还有handler,还有contact都创建好了,那创建好了过后呢。我们就就知道跟我们前面整个分析流程是一样的,这时我们在梳理一下它的过程。和我们前面所说的一样,每当创建一个China socket的时候呢,就会创建一个绑定的排烂一一对应的关系。创建排的时候,也会创建T节点和had节点,形成最初的链表。T是入战英镑的。啊,T是入战英镑的类型的handler head呢是一个英镑或也是一个out磅的类型的handler,在调用pipeland纳的时候呢,会根据给定的handler创建。
14:15
一个context,最后呢,将这个context插入到列表的最后。到这个时候,三个对象就创建OK了。好,各位同学,那关于这三个对象的创建,我们就分析到这里,大家呢,把这个代码再稍微的走一遍好吧。
我来说两句