00:00
所以接下来我们要实现的就是自定义的这两个类了,首先是all the timeout select,大家想一下,这个timeout select主要要做的是什么事情呢?他还要去实现一个什么类呢?什么什么接口呢?前面大家已经看到了,是叫做pattern timeout function,对不对?所以它这里边是不是可以拿到之前检测出来,我我们这里边不是所有那个匹配好的那个事件都保存在map里边了吗?所以这里边是不是相当于不是匹配好的事件,而是拿到的是超时事件,就是有开头没结尾的那些事件是不是也都存在一个map里边了,然后在这里边我们就可以定义对超时事件的处理方法,对吧,你已经拿到了,从map里边拿到了,那你到到底要把它包装成一个什么样子,做什么处理,最后输出呢?我们可以在这里边去做自定义,所以自定义超时处理函数。
01:10
呃,超超时事件序列对吧的处理函数,大家不要认为是只是处理一个事件啊,这里要处理的其实是一组这个序列,所以都在map里边保存着,这里面有有类型,一个in,一个out,这个就很简单,大家可以把它认为就是做一个提取转换对不对?它的输入的应是order,我们都已经定义好样例类了,Order event,输出就是一个order result,前面这个order result。好,所以接下来我们是不是直接只要实现它里边必须实现的一个叫做开out的方法就可以了。大家看一下这个太帽子里边是不是一个重要的参数,也就是这个mapp呀,跟我们之前做的那个sla是不是一样啊,这里边这个其实就是所有匹配到的那个事件序列,有开头没结尾的序列是不是都存在这个wep里面了,它是一个K6,那么P就是。
02:16
是不是也是我们前面定义好的那个个体模式的名称啊,对吧?啊叫begin,那拿出来就是begin的那个事件,那么拿到的事件是不是还是保存在一个list里边了啊,这是因为有可能个体模式有循环对吧,所以还是放在一个list里边处理,那这里边非常简单,我们要做的也就是把它是不是包装成一个想要的order result啊,Order result主要要拿一个当前那个order ID是什么?哎哟,那order ID是什么呢?那是不是就从这个,是不是从我们当前这个map里面去找啊,所以我定义一个当前的这个time out all the ID。
03:02
嗯。从map里面去取map map要做一个get get什么呢?是不是我要诶,那大家可能会想到你这里边既然要拿ID嘛,我之前都已经用那个,呃,就是key外过了,那是不是begin和follow里边都一样啊,都能拿到啊,这里大家要注意,我这里边超时匹配到的这个序列有follow吗?应该正常来讲就没有follow对不对?如果后边我们定义的这个事件序列比较多的话,假如后面follow,后边还有一个follow by,或者还有一个next,对吧,如果是这样多个序列的话,那有可能这个follow还有可能检测到,因为有可能是后面的没来,对不对?但这里边如果只有两个个体模式的话。这里的超时是不是一定是有begin没有follow啊,所以这里大家千万要注意,你这里边get的话就不要get follow,而只能get begin,你要get follow,那那后面再做操作是不是就空指针了,对吧?肯定就异常了啊,所以这里边可以拿到它的迭代器,然后再next获取到当前的order event,然后再拿他的order ID是不是就可以了,这就是我们当前的这个timeout的这个order ID,另外还输出一个字符串,我们说当前这个toutt对吧?啊,做一个报警。
04:32
这就是我们对于超时事件的一个处理,其实非常简单啊,就是把它包装了一下,输出一个结果就完事,然后另外我们还要做自定义,呃,就是我们这个匹配啊,就是正正常支付。事件序列处理函数啊,那这个大家知道,其实就是一个orderp select,它其实要实现的是一个什么,其实就是pet select function,对吧?啊,就跟我们昨天讲到的内容其实是一样的,这里边同样还是一个in,一个out,是不是前面in是all the event out是all the result对吧?所以我们把这个实现一个里边的select方法就可以了,对吧?哎,这里大家多说一句,就是前面我们这个开报的方法里边是不是多了一个参数啊,多了一个L,这个L是什么呢?对,其实就是它超时的时候,调用到这里来的时候的那个时间戳,对吧?大家如果要能要想用那个时间戳的信息的话,你可以用这个参数啊,这里边我们没有用到,那就算了,好,那下面。
05:52
跟这一个具体具体这个匹配上的这个支付事件序列,我们怎么去处理呢?同样是不是还是拿到对应的那个ID,然后我们说他成功支付就完事了呀,那所以定义一个order paid的order ID,它是不是还是从map里边去取get,这时是不是随便取了,你可以拿begin,是不是也可以拿follow了啊,那我这里边拿follow也是可以的。
06:22
Eerator,因为大家知道follow里边那肯定是一个pay的事件,对不对,你这里边甚至想要再输出一下它的那个transaction ID都可以,对吧?啊,这里边我们没有用它,所以这里边就直接简单的做一个next order ID,把它取出来包装成一个order result输出就完事了。paid的ID,这里边我们叫paid的successfully,输出一条信息,这样就做完了啊,所以大家看就是这个过程其实还是比较直观比较明确的,就是分这么几步,只不过在做这个超时事件提取的时候呢,稍微麻烦一点,我们要传一个这个测试物流的标签,然后还要再去定义一个pattern timeout方式,另外还得定义一个常规的pattern select方式,这两个都要定义出来。
07:16
嗯,好,然后接下来我们来看一下这个执行的结果。大家看到这里边我们已经输出这个所有的结果了,大家看到这里边有这个timeout对不对,这里边比方说34756有一个timeout 34767有一个timeout,我们来去数据里边看一眼啊,34767。诶,大家看34767,它是不是最后才做了一个支付啊,然后我们看一下它的那个创建时间是什么时候。4309490949的话,大家想一下它的超时时间应该是什么时候,超时时间是15分钟,也就是900秒对吧?加900那应该是431849那个时候就超时了,大家看一眼哦,他2021才支付当然就超时了,对不对啊,所以大家看到这里边果然它就是一个超时的事件那。
08:15
后边我们确认一下这个756又是什么情况呢?756是0913做的这个创建,那就是1813对吧?啊,它是1951,那当然也超时了,但是大家会发现这里边它这个输出为什么这么奇怪呢?它为什么是这个79767这个先超时,然后这个756才超时呢?啊,这是因为我们这里边是直接从文件去读取,文件读取的时候大家注意一下,可能会发现它最后的这个结果是正确的啊,但是它的这个定时器的触发的时间会有一点奇怪,大家可能会发现跟我们一个一个输入的这个状态不一样,对不对,所以如果大家想更准确的测试的话,就是这个结果是没问题的,但如果想要去准确测试,是不是还应该做一个。
09:08
做一个流式的输入啊,我们把这个还是重新定义一下,给大家测一下啊socket啊,这个我们就不用卡夫卡了。抄袭。这里边比方说7777还是啊,把它定义出来,然后接下来大家看一看。看一看这个代码执行的效果,我们到时候一条一条数据看一下它的行为是不是正常,对吧,这里边我们得去起一个NCK对吧。把它吸起来。然后接下来我们得去把这个数据做一个提取了啊。好,我们分屏给大家简单的看一下这个结果,哎,我们就逐条输入数据做一个测试了,首先这里这个34729这个create对吧,然后34720CREATE哦,这个这个就后面可能就有点儿麻烦了啊,我这里边34729,诶大家看到我这里边明明已经把它支付了。
10:22
为什么这里边它没有这个对应的输出呢。诶,这里大家要注意,它这里边一定要得等下一个时间戳,就是water mark有进展之后,它才会输出之前的结果。呃,有同学可能说,诶你这里没输出,难道一一直也是要一直等到这个15分钟超时的时候才输出一个,它那个成功支付吗?显然不会这么这么做对吧?那它显然是来一个就应该能判断一个,就应该实时的把它检测出来,调用我们那个select方式对不对啊,就直接可以输出结果了,只不过这里边要有一个water mark往后推移去检测的这样一个过程,那所以后边我们再来一个,呃,这里边如果再来的话,那这两个就都都配了,对吧。
11:09
诶,大家看。这里边我输入的明明是30730的这个配,结果输出的是729的那个成功对不对,所以它其实并不是并不是说当前输入的这个数据触发了这个操作,而只是你的时间朝后推移了,就导致我们这里边有这个结果输出输出了对不对啊,比方说这里面我还可以做一个,比方说呃,这里做一个呃修改啊,修改这个modify。大家会想到这里边,呃,当然了,这个按道理我已经配之后不应该能修改了,对吧,我只是做一个例子,就是给大家在相当于推进一下这个事件时间四六的话,诶,大家看是不是前面这个三零也配成功了,所以它其实已经检测到我们这个过程当中,是不是已经create完了之后配成功了呀,对吧?啊当然在这个过程当中呢,你超时是什么情况呢?我们看一下当时那个超时的是756是吧。
12:12
我们直接给这个create一下,然后在中间这个过程,可能这个有757。哦,另外大家会想到中间这个过程可能还有各种各样的其他操作,对吧,756最后是到这个1951这个位置才做了一个支付。诶,大家看这里边是不是前面的756和七五七两条都已经直接超时了呀,因为这里边如果来了一个1951的话,这个水位是不是已经涨过15分钟之后了,试件时间嘛,涨过15分钟之后了,它的15分钟是加900嘛,所以现在他俩就直接报超时。啊,那当然就是说我后续可以。
13:00
再create一些啊,大家再做一些其他的测试,比方说767这个,呃,这个时间。假如说这个时候我再来刚才的这个时间的话,大家说还有用吗?这这个还有用吗?没有那个已经关闭。好,大家可以看一下啊,这里边我可以先把这个先创建出来,这相当于就是就是乱序对吧,那后边我再做一个配2021。大家看是不是?当这个时间如果已经结束,超过我们的那个就是timeout那个时间之后,它再来的数据是不是对于我们而言相当于直接把它扔掉了呀,对吧,再来的数据是不是也不会匹配出来呀,而且大家看是不是既不t out也不也也也不那个成功匹配成功支付,所以相当于这个create是不是就没有进入到我们检测的这个过程中来啊,啊,所以这是这样的一个状态啊,另外大家可能比较关心的还有一个什么呢?就是我们不是说它并不是严格警铃吗?那假如说这里边现在我们先看这个事件时间已经进展到了2021啊,那2022我们先create一个,然后接下来在这个中间可能会有比方说modify,对吧。
14:26
呃,后边这个时间戳。可能是比方说一个二五的一个时间戳,然后接下来再给一个。支付的时间戳啊,那那大家说这样的情况是不是可以正常支付呢。当然后边是不是还得有一个东西来触发,呃,这个你就随便给哪一个触发都可以,对吧,我们给一个不同ID的去对它做一个触发,2033吧。诶,大家看它是不是直接支付成功啊,中间你做修改这个没关系,只要是print之后有配检测到这样的一个序列,它就是成功的,对吧?啊这就是我们用CP实现了一个超时报警的一个需求。
我来说两句