00:00
好了,咱们接着上一步来讲,我们说看到的线程池,然后里面去执行,对吧,接下来我们是不是应该要看。这个对象这个类型的一个run方法呀,那我们直接点进来runner,那run方法里面它又调用了一个start。再点。点进来之后,呃,他。对汇报和这边就是对一些状态统计嘛,咱们对打叉的日志是不是还是比较友好的呀啊,他中间做了很多一个统计啊整理,那还有什么判断他的状态啊啊,然后怎么去显示打印日志给用户看呢,对吧,这一块咱们就先不用管了啊。失败就汇报啊,有未执行就怎么样啊,对吧。那不是核心逻辑,我们直接往后拉一点,大概在231行左右,这边有一个什么。Task do start,这才是真正的执行逻辑,对吧?啊到这了,呃,点进来,诶点一下点进来我们会发现什么呢。
01:12
这边有两个核心方法,一个叫什么写的,Rier的线程启动,瑞的线程启动。那这个线程是什么呢?你一点点上来,发现这两个都是一个什么线程。那在哪里赋值呢?其实大家再往下看一点。在这里,这个是什么?这是不是在new的时候,New这个task对象的时候给他传的,呃,在构造器里面赋值啊。对吧,呃,那他们两个都调用的同一个方法叫什么呢。Generateator runner,那这里在文档里我没有去细看啊,我这边只给大家写了,可以看一看generateator runner啊,就完事了啊,因为这不是我现在关心的一个重点。
02:11
你想看你就点过来,再点过来看一看它这里面的一些处理。呃,当然了,这边的类型大家先留个印象,是这个东西啊,一会儿要看到这个。你就记住有他就得了呗,嗯。好。那他们分别是什么类型呢?那start方法你去看也没用啊,对吧,那你再看到副值这个地方啊。他是不是强短的类型啊。它是一个多态的写法,对吧。那也就是说咱们分别要去看这两个类啊,这两个类那这边我就只看一个就得了,因为咱们的毒是不是跟腺速有关系啊,你限速的时候怎么来实现的呢?咱们了解了解它咋设计的,那这个是不是跟毒有关呢?跟写可能写一般来讲是比较被动的啊,所以不用太关注它,来我们看一下read runner这个类,它里面呢,有一个什么,它不是线程嘛,线程还是得看什么run方法啊,乱方法进来之后,呃,是真正的执行的呗,啊也就对应哪一块啊,这一块是不是reader执行啊,对吧?Reader的这个task给他执行了啊,那这边呢,我也标注了几个重点方法来对应咱们这张图里边来初始化in it。
03:50
Prepare准备还有什么呢?Start read开始读,还有什么post,当然后面他finally里面有一个destroy。
04:03
Destroy最终他都会销毁嘛,回收嘛,啊那大家觉得哪个最重要呢?哪个方法你初始化做一些准备工作,这也是准备工作这个事后的,那其实最核心就是他开始读啊,所以咱们只会去看这个东西,其他就不不管了。呃,点一下start reader,那到了这儿之后呢,发现没了呀。对吧,抽象类里边的抽象方法CTRL加去,那这个时候你就懵逼了啊。这个是data差实现的一些reader是不是都是插件式的对吧,你自定义开发是不是这里就又多一个啊,那我们随便挑一个吧,大家对哪个最熟呢?那应该是my circle了,那么就看my circle呗,找找my circle里边的start reader方法,诶,说到这个啊,同学们,呃,就这个事儿啊,如果你要自定义插件。也就是自定义,自定义一个一个reader。
05:04
那怎么办呢?你是不是要继承它相关的类啊,或者接口啊,然后你是不是要重写这几个方法呀,对吧?它都是有规范的,呃,大家看记号上面的一个插件开发说明,他应该也会提到你要继承一个什么模板类,然后呢,要写这几个方法对吧。每个插件的逻辑都不太一样啊,嗯,当然大差不差的那行,废话少说啊,My circle reader进来找,刚才那个方法是start reader。进来之后呢?这有个fetch size,那那这边呢,就是你看这是个字符串对吧,一个常量。看看有没有指定size,如果,呃,这个无所谓了,来接下来调用了一个什么,因为咱们my circle是关系型数据库,所以它调用是什么?通用的关系型数据库reader。
06:02
对吧,RDBMSR就是嘛。那DB就是数据库嘛,MS。MS是啥?Manager server啊。好,那我们直接看这个方法呗,废话少说,点进来,点进来之后这边。我们直接看核心方法啊,它里面是这个。大家注意万呃,如果有些bug,比如说呃,某一些插件对杠R-N没有做处理,你想改源码二次开发怎么办?重点就在这个方法,一般都是在读的时候出问题。就找这个方法的实现就行了,然后在里面你去做修改,重新打包替换到价包就可以了啊这个很简单啊,像我之前嗯改过很多小功能。
07:01
那呃,这个核心方法好,废话少说,进来。Transport one record,这是指的是一条数据的处理啊,你看这里是写了一个循环,这是不是一个结果集啊,关键型数据库嘛,对吧,结果机循环就是一条一条的,就是每条的处理逻辑好,那这一条它是怎么发往writer的?这里有个方法叫send to writer。再点进来没了CTRL加H找谁呢。呃,还记得刚才我说可以看一看那个generator runner那个方法吗?我说留个印象,有个东西咱们会去看是啥呢,就他们。就他啊。那我直接找他就行了。因为没有太详细带大家去点,其实点多了没什么意义,大家记不住啊。
08:01
大家知道找这个类就行了啊,至少目前找这个类我们先看一下它的实现吧,呃,Centerw writer,那在这里呢,重点有一个flash。Flash呢,咱们点进来。他又调用了一个什么。channel.push2,因为reader是不是跟channel交互啊,对吧,那再点一下PUSH2。这个是什么?开始。Push开始布局那两个参数,第一个是什么呢?RS.size是不是数据条数啊,那这个呢,是不是数据量了啊,这是这两个参数啊,来点一下。我们现在要了解了解它是怎么限速的啊,来往下走,呃,在大概是203行左右,它是这样啊。
09:00
啊,这个咱们也不用看了,看这里吧,这比较直观。也就是说,如果限速模式啊,是通过什么呀,通过字节数来限制的,那他怎么弄呢。哎。也就是说当前的速率已经大于咱们限速的那个速率了,看到没有啊,也就是说速率大于你的限制,那怎么办呢。它会指定一个什么sleep time睡眠时间,也就是说你太快了,你慢一点,你先等一会儿对吧?嗯,龟兔赛跑一样啊,乌龟的速度是标准的,但是兔子超过了它的速度,那你先睡一觉啊。嗯,那你看。他有一一套计算逻辑对吧?啊,这个自己看一看就行,一个乘一个减啊。那接下来另一个逻辑是什么?如果咱们使用的是record限制,也就是说数据条数的限制。
10:01
那你再看看它的判断条件,如果当前调速的速率大于限速的速率,那就怎么样,还是让你睡一下,睡多久呢?还是一样的,其实这两个公式的一个逻辑是一样的,对吧。当前速率乘以一个间隔除上。限速再减去间隔,要睡这么久啊,要睡这么久。那最后呢,如果两个都设了怎么办呢?还是以同一个问题怎么办取最大啊,谁需要停的时间最长,那就以他为准,那肯定啊,对吧。就超速,就你你想想开车嘛,超速这条道限速100公里每小时一辆开到200公里每小时一辆开的是150,那谁更过分啊,是不是他更过分啊,对吧?那如果出车祸谁最严重,他最严重。
11:01
所以重点要限速最快的那个,超的最多的,所以我们是取最大值。那如果它大于零,那直接就是它啊,就开始睡啊睡啊它就是它限速实现的方式啊同学们,其实如果不讲的话,可能大家一开始想,哎,我咋限速呢,怎么实现的呢。但是其实嗯,实现的方式方法并没有特别难,特别复杂,对吧。好,这个是咱们对在数据传输里面限速的一个实现啊,那这边我也简单写了一下调用站啊,该怎么去点过来啊,然后一些核心逻辑我都标红了啊,大家可以去看一看啊。
我来说两句