00:00
好,那接下来呢,我们进入到这个调度模块啊,那这个模块的主要作用呢,就是调度数据质量监控的工作流程啊,没错啊,那数据质量监控它也是一个工作流程,那为什么数据质量监控也是一个工作流程呢?那我们来简单分析一下啊,那我们要想做数据质量的监控啊,那咱第一步就得干啥,是不是就得去监测数据质量问题?没错吧?那监测到数据质量问题之后呢,需要将结果写入到MYSQL数据库。对吧?那后边是不是还有一个告警的模块了,对吧?那告警模块呢,需要从数据库当中去读取异常数据,然后呢,再发送告警信息啊,那大家注意观察,那这些任务是不是就组成了一个典型的工作流程啊,我画了一个流程图,大家可以看一下啊好,那这就是数据质量监测任务的工作流程啊好,那上边这三个呢,分别是OD层、DWD层和dim层的数据质量监测任务。那等他们执行完成之后呢,会把这个监测结果写到数据库当中,那等他把结果写到数据库里边后,我们才能调用check notification这个脚本啊,去检查数据质量问题,然后再进而呢发送告警通知啊,OK,那这就是我们数据质量监测任务的工作流程,那在这儿呢,我们的数据质量监控的工作流程也是采用阿兹卡班进行调度啊,那大家想一想啊,那你说数据质量监控的工作流程是不是必定依赖于数据仓库的工作流程啊?
01:31
那为什么大家想一想来我们举个例子啊,现在我们以OD层为例啊,那来说咱是不是必须得保证数据仓库当中的OD层的计算任务执行完成之后,我们才能去检测OD层的数据质量问题啊。没错吧,那所以说肯定是有依赖关系的,那具体的依赖关系是什么样的呢?哎,我这儿也画了一个图啊,咱一起去看一下啊,啊大家来看一下啊,那这儿一共有两个工作流程,左边这个就是我们数据仓库的工作流程,那右边这个呢,就是我们刚刚看到的数据质量监测任务的工作流程,对吧?啊,那这个虚线呃,所表示的呢,就是这两个工作流程之间的依赖关系。
02:10
啊来我们简单看一下啊来我们看这啊,这个是ODI层的数据质量监测任务,对吧?那它是不是肯定得依赖于呃,数据仓库当中的OD层的计算任务对吧?那也就是依赖于hdfs to ods DB和hdfs to ods log。没错吧,啊,然后我们再继续往下看,那这个呢,是DWD层的数据质量监测任务,那它必然依赖于数据仓库当中的DWD层的计算任对吧?啊,那也就是OS to dwd DB以及OS to dwd log啊,然后最后一个啊,这是呃,Check dim,也就是dim层的数据质量监测任务,对吧?那它肯定依赖于数据仓库当中的dim层的计算任务。头吧,也就是OSDB,那就是这两个工作程当的关,那这个依赖关系我们如解决啊,那大家最容易想到的一个方案呢,诶,肯定是将数据仓库当中的计算任务和数据质量监测的计算任务呢,给它放到同一个工作流程当中。
03:16
对吧,那具体怎么操作呢?我举个例子啊,那比如说那这个就是ods层的计算任务,对吧,那它后面呢,就紧跟着ods层的数据质量监测任务啊,那再比如这个是DWD层的测任务,那他后面呢,就跟着DWD层的数据质量监测任务,那这样一来呢,我们这个依赖关系肯定是能够解决的啊,但是呢,这样会带来一个问题啊,什么问题啊,就会导致我们数据仓库的工作流和数据质量监测的工作流呢产生耦合。对吧,那这个呢,不是我们想要的,那在这儿我们怎样才能将数据质量的工作流程和数据仓库的工作流程给它分开呢?诶,在这我们用的是这个方案,大家往后看啊,在这呢,哎,我们利用的是阿兹卡班的API接口啊,用它干什么呢?利用它去主动监测数据仓库的工作流的执行状态。
04:11
啊,那具体怎么操作呢?那我比如说还是举一个例子啊,那假如说这个呢,是我们数据仓库的工作流程,那每个小方块儿呢,代表的就是这个工作流程当中的一个job,也就是一个node节点,那之后呢,哎,我们令数据质量监控的工作流去循环查看啊,这个数据仓库工作流的某个节点的执行状态。啊,那比如说一秒钟查看一次,一秒钟查看一次,那如果说这个状态呢,它是未完成的状态,那我们就继续查看,那如果这个状态是已完成的状态,OK,那这时候呢,诶,我们就开始执行数据质量监测的工作流,那这样一来的话呢,我们就既能够保证两个工作流之间的依赖关系,又能够将两个工作流给它分开了,这是我们解决这个问题的一个方案啊,那我们到底应该如何去监测数据仓库工作流程当中的诶每个节点的执行状态呢?
05:05
那其实刚才我们提到了啊,说在这儿呢,我们需要用到阿兹卡班的API对吧?啊OK,那接下来呢,我们就打开阿兹卡班的官方文档啊,然后看一看我们到底需要用哪个API啊好,那大家来到阿斯卡的官网之后呢,我们点击API document啊点一下,那点完之后呢,这里边有非常多的API,那这里我们用谁往下翻,这里边我们需要用到的是这个啊。Fetch a flow execution,那咱们点一下这个API,就是这个API呢,它能够给我们返回一个当前正在执行的工作流程当中的每个节点的执行状态,OK,那我们需要的就是它啊,那我们来简单看一下这个API我们到底应该如何使用啊来简单看一下,那首先那这个呢,诶是我们要给他发送的请求的方式啊,要求是get请求对吧?那下面呢,这是我们要请求的地址,那再往下呢,诶是我们请求时需要传入的参数,那分别是什么呢?第一个诶,SESSION10ID,这个SESSION10ID指的是什么啊啊30ID呢,指的是我们在登录阿兹卡班之后所获取到的这个用户的会话ID。
06:10
啊,那接下来再往下走,下边还有一个阿杰克斯等于fe exq的flow,那这个呢,是固定的写法,那我们再继续往下走啊,那下边呢,还有一个ESEID,那这个呢,指的就是我们一个工作流程的执行ID,那这个工作流程的执行ID呢,会从一开始逐渐递增啊比如说我现在有一个工作流程啊,我第一天执行的时候呢,它的ESD就是一,那第二天呢就是二,第三天呢,就是它会依次递增的,好,那这个呢,就是我们发送请求时需要传入的三个参数啊啊,我们再继续往下看啊,那下边呢,诶有一个例子,这个例子是什么呢?就是一个响应的例子,那也就是说我们给它发送请求之后呢,它会给我们相应的响应,对吧?啊好,我们来看一下它响应的结果是什么样的啊,显然是一个阶森的形式对吧?好,那在这里边呢,我们重点看一下这个字段。
07:01
这个字呢是nose nose是不是就是节点的意思啊,对吧?那大家注意观察,这个no字段后边是一个数组,对吧?啊,那数组里边的每个元素对应的是什么呢?实际上对应的就是这个工作流程当中的一个job,也就是一个节点啊。那我们现在呢,看一个节点啊,比如以它为例,那这里边有哪些信息,首先会有一个诶node的ID啊,那还有什么呢?还有这个no的开始时间啊,还有这个noe的结束时啊,以及这个no当前的状态等等等等,那也就是说整个工作流程当中所有的noe,所有的节点,它的执行状态,我是不是都能够通过这个响应结果获取,OK,那这个呢,就是我们去监测诶数据仓库工作流程当中的每个节点的执行状态的时候呢,需要用到的API啊,那接下来呢,我们再去看一下这个调度模块的完整的实现思路啊,那在这个当中呢,我们一共需要编写四个Python脚本。
08:00
啊,那首先我们先看第一个啊,那第一个实际上是一个对阿卡班API的封装脚本啊,在这个脚本当中呢,实际上有一个的数,就是就是它这个VI node这个no函数,它能够实现什么样的功能呢?我们来看一下啊,它可以等待我们指定的一个工作流程当中的任意节点执行完毕,那当然啊,这个函数的实现逻辑呢,就像我们刚才所说的那样啊,它会循环的去检测我们指定的工作流程当中啊特定的节点的执行状态啊,如果状态未完成啊,那我就继续查看,那如果状态是完成了,那我就继续往下执行。啊,OK,那这就是我们的第一个脚本的核心内容,那除了这个脚本之外呢,我们后边还会有三个脚本,这三个脚本呢,分别对应于我们数据仓库当中的ods层啊DWD层和DM层啊,也就是每层一个脚本,那这几个脚本当中的核心逻辑又是什么样的呢?其实很简单啊,那在这儿呢,我们以OD层的这个脚本为例啊,那在OD层呢,我们会首先调用啊阿卡文CPI封装脚本当中的VI no的函数。
09:11
那之后呢,再去调用我们前面所编写的数仓各层检测脚本当中的ods层测脚本,那这就是ods层这个脚本的核心逻辑啊,现在呢,我们来看一下这个脚本它能够实现什么样的功能啊,那首先我们会使用啊,让他去等待,等待什么,等待数据仓库当中的ods层的计算任务执行完成。啊,那只要ods层的计算任务执行完成了,那下边是不是就会触发我们这个ods层的数据质量检测脚本呀,OK,那就是该脚本实现的功能啊,那后边的DWD层的脚本,DM层的脚本呢,也是同样的道理啊好,那接下来呢,我们把这四个脚本的内容来分别去看一下啊。那现在我们看第一个啊,第一个yon,一个log in get e s数呢,我们刚刚已经讲过了,对吧?啊,那它的功能呢,就是等待指定flow当中的指定节点执行完毕,并且判断其是否执行成功。
10:23
啊,那这个函数的原理我们刚刚也讲过了,对吧,那它是怎么去实现的呀。他用到了阿兹卡班当中的一个API,对吧?哪个API啊,这不就是这个fe of flow excution API对吧?那这个API它能实现什么样的功能,大家还记得吗?就我们使用这个API呢,能够去获取我们指定的flow当中的定节点的执行状态,对吧?啊,那实际上这个函数呢,哎,它的原理就是循环去使用这个API去获取我们指定的flow当中的指定noe的执行状态。如果我们获取的状态是未完成啊,OK,他就会继续去查看它的状态啊,那直到完成为止,那刚才我们也提到了啊,就是我们在使用这个API的时候呢,需要给它这样的几个参数,对吧?那其中有一个呢是CD,还有一个呢是ex。
11:15
对吧?那这两个ID我们怎么获取呢?来,来看文档啊,在这呢,我们写了两个函数啊,一个是log in,一个是get e,这两函数呢,就是专门用来获取我们所需要的ID和ID的啊来,我们先看login函数啊,Login函数呢,它可以录S卡班,并且返回我们所需的CID,那get e e cid这个函数呢,它可以获取正在执行的工作流程的EXID,好,那这就是az client这个脚本的核心函数啊,那现在呢,我们把这个脚本创建出来,然后呢去看一下这个脚本的具体内容。好,那我们现在呢,先在idea当中新建一个文件啊,Az c.PY来CTRLC打开L,然后呢,我们右件,然后new啊fail ctrl v,好,那之后呢,把脚本的内容给它复制过来啊,来我们拿一下。
12:09
来到这儿啊,来CTRLC。打完之后呢,CTRLV。好,那这个脚本呢,我们就已经给它创建出来了啊,那接下来我们先整体的看一下这个脚本的内容啊,来先看这个位置啊,那此处呢,是声明了几个与阿兹卡湾相关的变量对吧?啊好,我们继续往下走啊,那下边呢,诶,封装了一个函数叫做post对吧?这个函数的作用是啥?简单看一下是不是就是发送posts请求啊对吧?那接下来往下走啊,那下面呢,是不是又封装了一个get方法对吧?那这个get方法的作用是啥呀?是不是就是发送get请求?没错吧,好,我们继续往下走,那下边呢,就是刚刚我们提到的哎,三个核心函数之1LOGIN对吧?那这个函数的作用是啥?是不是获取3IN ID对不对?然后再往下走啊,那这是我们三个核心函数里边的第二一个叫做get e s e ID对吧?那它的作用呢,就是获取excution ID啊,然后再往下啊,下边呢,就是我们最核心的一个函数了啊,叫做VI note,那再往下呢,就没有了啊好,那接下来呢,我们去看一下这个脚本每部分的具体内容啊来我们先看第一部分啊,第一部分是不是就是那几个与阿兹卡班相关的变量啊对吧?来我们主看一下,先看第一个啊,第一个呢,叫做AZURL,这个az URL呢,实际上指的就是阿兹卡班web server的API的接口地址,大家呢需要根据自己的实际情况进行相应的修改,那重点呢,就是注意一下这个主机名啊,好,然后再往下走啊,那下边呢,就是阿斯卡班的用户名和密码啊,当然这个也得根据自己的实际情况进行相应的修改啊,好,再往下走。
13:43
那最后两个呢,诶,分别是project和flow啊对吧,一个是工程的名称,一个是flow的名称,那这两个呢,我需要着重的说明一下啊,啊,也就project名称和名称到底怎么确定呢?来现在呢,就以我们之前自己创建的数据仓库的工作流程为例啊,我们一起去看一下啊,首先我们打开阿斯卡湾的工作界面啊,这是他的工作界面对吧?然后呢,找到我们之前创建的数据仓库的工作流程,大家来看啊,是不是就这个呀,对吧。
14:12
那此处展示的这个名称,也就是j ma,实际上就是我们要寻找的project的名称,对吧?大家可以看一下啊,这是不是有一个projects对吧?也就是此处展示的就是所有的project,没错吧?那这个呢,显然就是project名称啊,那flow的名称又应该怎么确定呢?哎,也不难啊,你点一下,点谁点这个jama点来之后呢,大家去观察啊,此处是不是有一个flows啊,对吧?那也就是说啊,那现在展示出来的内容是不是就是j ma这个project下边所有的flow啊,对吧?OK,那也就是说这个名称实际上就是我们要寻找的flow的名称,那这儿也是j ma对吧?啊所以说大家看这哎,我这儿是不是project的名称和flow的名称都是这ma对吧?当然大家呢,得根据自己的实际情况进行相应的修改啊好了,那这几个变量我们就说完了,那接下来我们继续往下看啊,下边呢,是这个posts的函数对吧?这个posts函数呢,它的功能刚才也说过了,其实就是发送posts的请求,主要是为了方便啊,因为我们后边呢,呃,会使用到阿斯卡班当中的多个API啊,有的API它要求我们发送posts请求,有的API呢要求我们发送get请求,那所以在这为了方便哎,我们分别封装了两个方法,一个是post,一个是get啊我们现在先来看这个post啊,那post方法的参数呢,一共有两个啊,分别是URL和date d URL呢,其实就是我们发date请参。
15:38
啊,那这个方法的返回值是什么呢?啊,其实这很简单啊,这个方法的返回值就是我们请求阿兹卡文这个接口的响应结果啊OK,这就是postose方法啊好,接下来我们再往下看看这个get方法啊,那get方法呢,也需要两个参数啊,那分别也是URL和date URL呢就是我们要请求的地址,然后date呢,就是我们请求所需的参数,那同样它的返回值呢,也是我们请求接口的响应结果啊好,那post方法和get方法我们就说完了,那再往下呢,就是这个log in函数了,对吧?那现在我们来看一下这个log in函数是如何实现的啊,那这呢,其实给我们说明了已经使用呢,它也用到了一个阿斯卡班当中的API对吧?好,那现在呢,我们可以去看一下这个API到底如何使用啊,来我们找到阿斯卡班的API的文档,然后呢,CTRLF咱搜一下。
16:39
啊好,其实就是第一个对吧?OK,那看一下这个API的介绍啊,首先它要求我们发送的请求是POS请求,对吧?那这个呢,是我们请求的地址啊,然后我们再往下走,那下边是不是就我们要入的几个参数啊,对吧?来看一下都是什么参数,第一个action等于login,这是一个固定的写法,对吧?然后下边就是我们的username和password,也就是用户名和密码了。
17:02
没错吧,啊好,那我们再往下走看一下它给我们的响应是什么啊,来这个呢,就是一个响应的结果啊,大家注意观察,响应结果呢,诶是一个杰森对吧,里边只有两个字段,一个是啊成功对吧?那另一个呢,就是session.id对吧?也就是说它的响应结果当中就包含了我们后边需要用到的session ID。OK,那这个API看完之后呢,我们再回过头去看一下login函数的实现逻辑,首先我们先看这儿啊,那这儿是不是就是我们所需要传入的三个参数啊,对吧?分别是action username和password,然后往下走啊,那下边我们是不是使用了一个post请求啊,然后呢,去请求咱们阿斯卡班的CPI接口的地址,对吧?然后呢,将相应的参数也传给他了,那这个POS方法的返回值是什么呀?刚才我们说了对吧,是不是就我们请求的这个接口的响应结果没错吧?也就是啥?是不是也就是一个这样的呀,对吧?那我们需要获取的是谁?哎,是这个杰当中的session ID没错吧?那所以说我们后边return的是啥?是不是就是我们这个结果当中的session ID这个字段的值啊?
18:09
没错吧,哎,这就是log in这个函数的逻辑啊,其实很简单对吧?好,接下来我们再继续往下走啊,看下一个,哎,Get个ESECID啊,但是这个函数它的逻辑也不难啊,来看一下它是怎么实现的。啊,它使用的是fetch running excus of a flow API去获取正在执行的flow的EED,对吧?也就是他这儿其实也用到了阿斯卡湾当中的一个API,那现在我们也是先去看一下这个API的使用说明,来CTRLC,然后我们去搜一下啊,来CTRLFCTRLV啊,然后回车,大家注意观察,那这个呢,就是我们此处要用到的API,对吧?我们先来看一下这个API,它的功能是什么啊,那这句话呢,就描述了这个API的功能啊,在这我简单给大家解释一下啊,我们通过这个API呢,能够去获取我们指定的project当中的指定的flow啊,当前正在执行的记录的excution ID,注意啊,它只会返回当前正在执行的记录的excution ID。
19:12
啊,OK,那这个怎么去理解啊,那大家都知道啊,我们指定的一个project当中的一个flow呢,它是不是可能会执行多次啊,对吧?那就好比我们这个数据仓库的工作流程对不对?他是不是需要每天执行一次对不对?那他每次执行是不是都会有一个记录对吧?那每个记录是都会有一个自己的ED,也就是ID啊对吧?OK,那其实我们可以去看一下,呃,我们这个工作流程之前的历史记录对吧?好,那现在我们点开这个history,大家注意观察一下啊,那这些是不是就是我们之前的历史记录啊,对吧?那这里边大家注意观察,你看这这是不是都是j Mo这个工作流程的执行记录啊。吧,你看啊,是不是每次记录都会有一个execution ID,是这个道理吧,那这个excu ID呢,我们前面也提到过,它是不是从一开始逐渐递增啊,对吧?啊,然后大家要注意啊,这个API它所返回的是什么?它所返回的是我们指定的工作流程当中的float正在执行记录的excution ID,也就是说历史记录已经完成的记录的ID,它会返回吗?哎,它是不会返回的啊,这个要注意一下啊,好,那接下来我们继续往下看啊,那下边呢,就是我们使用这个API的时候呢,需要传入的几个参数,那分别是session ID啊,还有一个呢,是阿贾克斯等于get running,这是一个固定的写法,这个不多说,然后再往下,诶,这个就是我们指定的project和flow啊好,那我们再往后啊,后边我们看一下它的响应是什么样的,这个就是一个响应的结果,然后大家注意观察这个小样,结果其实看起来很简单,对吧,只有一个字段ESECAID,注意后边是不是有一个S啊,对吧?而且它后边的数据呢,它是一个什么类型呢?是一个数组类型的。
20:51
啊,也就是说,哎,我们在这儿呢,给他指定一个project,指定一个flow,那他给我们返回的这个执行记录ID呢,可能会有多个,那为什么可能会有多个呢。
21:04
啊,这个呢,我需要给大家解释一下啊,那什么情况下会出现多个e sed呢?很简单,假如说我现在呢,有一个工作流程啊,我现在给他提交了,在他还没有完成的时候,我是不是又给他提交一次。对不对,那这时候是不是相当于我们指定的工作流程,现在有两个记录是正在执行的呀,对吧?那他就会把这两个记录的ID都给我们返回,那所以说我们得到的结果是不是就可能是会包含多个ID的呀,对吧?那当然对于我们这个数据仓库的工作流程来说啊,我们同一时刻啊,只会提交一次,那所以说我们得到的想要结果呢?哎,它也是一个数组,但是这个数组里边呢,是不是只有一个元素啊,对吧?我们要做的呢,就是从这个数组里边获取第一个元素就行了。啊,好,那这个API我们就介绍完毕了,那接下来再回到咱们的代码啊,来看一下这个函数的实现逻辑,好,我们先看这部分内容啊,这部分内容是不是就是我们请求这个API所需要传入的几个参数,对吧?那分别是30ID啊,阿贾克斯啊完了之后呢,Project还有flow,那大家要注意的是啊,这个session ad我们应该怎么获取,是不是应该使用上边的log in这个函数获取啊,对吧?这里要注意一下啊好,然后再往下走啊,下边呢,是不是咱们调用了get这个方法啊,啊,向我们目标地址发送了一个get请求啊,对吧?啊完之后,那这个get方法它返回的结果是不是就是我们请求这个地址的响应结果。
22:29
没错吧,然后我们需要从诶这个响应结果当中获取ec这个字段的值,对吧?刚才我们看到了啊,那这个值其实是一个数组,对不对啊,我们需要获取这个数组里边的第一个元素,没错吧?那所以后边大家看这儿啊,是不是我们获取的就是这个数组当中的第零个元素,然后呢,给它返回出去了对吧?啊,好,那这就是get e SE cid这个函数的逻辑啊OK,我们再继续往下看啊,那下面呢,就是我们最后的一个核心函数了,就是VI node,那这个函数的逻辑呢,就是循环使用fech flow excution API啊,去获取我们指定的project当中的指定的flow当中的某个节点的执行状态。
23:12
啊,那如果我们返回的状态呢,是未完成,那就继续直到它完成为止,那这个fight flow ex API的使用我们之前就已经看过了啊,所以此处呢就不再赘述了啊来,我们直接看代码啊,那首先我们先看一下这个函数所需的参数啊,那它呢,一共需要三个参数啊,分别是session ID啊,ESECCIID还有note ID啊,那这个session ID呢,我们需要使用上边声明的log in函数去获取,那SECCIID呢,需要使用get e s SE cid这个函数获取。那这个node ID啊,它指的是工作流程当中的某个节点啊,这个是需要我们自己传入的啊,例如我们后续呢,可以传入数据仓库工作流程当中的一个节点ID啊,比如说呃,Hdfs ods DB,那这样一来呢,这个函数它就会等待hdfs to ods DB这个job执行完成,那进而呢,再根据我们的配置去触发ods层业务的数据质量监测任务。
24:14
好,那这就是它的三个参数啊,那我们继续往下看啊,来看这儿,那这部分内容呢,就是我们使用上边的fight flow execution API啊,所需的三个参数,对吧?那这个呢,我们可以去对照着看一下啊来我们首先搜索一下这个fe flow execution ctrl c,我们拿过来啊,CTRLFCTRLV。好,那现在找到这个API,大家来看一下,这就是我们需要的三个参数,对吧?啊,我们在这呢,跟它是一致的,这个一定要保证一致啊好来往下往下走,我们看一下啊,那首先这个呢是session ID,没错吧,它等于我们传入的session ID,还有一个是阿贾克斯等于e SEC flow,这是一个固定的写法啊,然后下边啊,Eeccad等于我们传入的e SE cid。好,那这几个参数看完之后,我们继续往下看啊,那下边呢,我们声明了一个status变量对吧?啊,实上这个status呢,它指代的就是我们所指定的当中的flow当中的啊,这个具体的一个节点的执行状态啊,它始值呢,现在是none对吧?啊,然后我们再往下,下边呢是一个循环对吧?这个循环呢,就是我们not这个函数的核心逻辑了,那我们来看一下这段逻辑啊,那首先此处会循环的去判断statuss是否等于succeed field cons SK以及killed。
25:34
啊,大家注意一下啊,实际上这几个状态呢,都属于什么?是不是都属于完成的状态啊,对吧?如果status等于他们其中任意一个,就表明这个状态已经是完成的状态了,对吧?那此时呢,就会退出循环啊,否则呢,就会继续循环啊好,那接下来我们看一下这个循环里边的逻辑是什么样的啊来,首先我们看这。那此处呢,是不是调用了我们前面定义的get方法啊,对吧?啊,然后呢,使用这个方法向这个地址啊,发送了一个get请求,对吧?并且传入了相应的参数啊,那这样一来的话呢,我们是不是就能得到这个API接口的响应啊,对吧?那注意观察,它是把这个响应结果赋予了flow e SEC这个变量,没错吧?大家还记得我们这个API它的响应结果的格式吗?还记得吗?还不记得,我们去看一下啊来,我们打开API的文档,然后往下翻,OK,那这个是不是就是一个诶响应的结果呀,没错吧,我们要从这个响应结果里边获取啥?是不是获取我们指定的一个节点的状态啊,对吧?那怎么获取啊,再来看一下,那首先我们需要先找到no这个字段,对吧?
26:40
啊,No,这个字段后面的是一个啥?是一个数组啊,是一个数组,那数组里边的每个元素对应的是啥?对应的就是我们工作流程当中的一个节点。啊,是这样的,比如说我们这儿看一个啊,比如说以第一个元素为例,那这个元素它所对应的就是工作流程当中的test的这个节点,这是不是有一个ID啊,对吧?这个ID就是咱们那个节点的名称啊,是这样的啊,完了之后里边是不是还有一个字段叫做status啊,对吧?哎,那这个就是我们想要获取的那个状态。
27:10
啊,是这样的啊,然后大家注意一下,我们此处呢,要获取我们指定的一个节点的状态,对不对。啊,那你说我怎样从数组里边找到我们指定的一个节点的状态呢?啊,由于它是一个数组啊,它并不是一个map结构,如果是map,那假如它的K就是这个节点名称,那我是不是就可以根据我们传入的节点的K啊,去获取对应的value呀,对吧?哎,但是它不是一个map,它是一个数组,那所以说在这儿我只能怎么做,哎,我只能去便利no这个数组对不对,然后呢,逐个元素去比较对吧,我看一看,哎,这个元素它的ID是不是我传入的这个节点的ID啊,如果是,那我就获取它的状态啊,如果不是,我再继续循环。啊,是这样的啊,咱只能通过便利的方式去寻找我们指定的节点的状态啊好,那现在呢,我们再来看一下代码,好再来看一下啊,那在这儿是不是flow eec,就是我们刚刚看到的那个响应结果呀,对吧?啊之后你看它是怎么做的啊之后呢,它是不是从flow eec当中拿到了no数组对不对,拿到no数组之后呢,是不是就对这个no数组进行了一个循环历啊对吧?然后呢,历的时候呢,去判断啊,这个node的ID是否等于我们传入的nod ID对吧?如果等于,哎,那就将哎这个元素的状态status,对吧?它里边的值取出来,取出来之后呢,赋予我们前面声明的这个status变量。
28:36
那这样一来呢,就相当于已经拿到了我们所需的指定节点的状态了,对吧?啊啊,那这样一来,这一轮循环就算是完成了,那完成之后呢,它会诶,SLEEP1秒钟,也就是等待一秒钟啊,OK,等待一秒钟之后呢,是不是会继续判断这个是否是完成的状态啊,对吧?如果还是未完成,那就再来一轮循环,那如果完成了,呃,那就退出循环,然后直接return一个status等等于succeed。
29:03
然后大家注意一下这个返回值啊,这个返回值是一个什么类型的呀?哎,是一个布尔类型的,对吧?它会返回true或者是false啊,什么情况下会返回true呢?诶,如果这个状态啊,它是完成的状态,并且是成功的状态,那它会返回一个true对吧?那否则呢,就会返回false啊这个大家一定要注意啊,好,那这就是VI note这个函数的核心逻辑,呃,那至此呢?呃,Az client.py这个脚本我们就讲完了。
我来说两句