00:00
把这个定义完了之后,上边再进行处理的过程,Reach Fla。Function里边这个就比较简单了,在flat map这个方法里边,我们要做的那就是判断当前的状态,这里面需要首先呢做一个初始化。所以我们首先。如果状态为空。进行。初始化。If啊,那这里面我们应该首先要做一个。对应的获取啊,先把当前的这个状态先获取到。就叫做state。那么current state里边调用当前的方法。那假如当前的state。如果是的话,那么我们就直接让state等于。枚举类型set点比你手直接让他等于过来。然后接下来呢,那当然就是基于当前状态跳转到下状态对吧。
01:07
跳转到下一状态。进行状态的跳转啊,那当前我们定义一个next state。它的跳转就是state,取当前的状态调用。状态转移的方法transition,那我们要传入的当然是当前value even time,把当前的类型要做一个传入。传完了之后得到了下一状态,注意这里我们还得做一些判断啊,因为假如说直接就统一在在这个状态跳转这里去做。去做判断的话,那这里面我们有一个问题,就是如果跳转到了匹配成功match的话,我们这里它是不会直接跳回到S2的啊,那我们这里边如果要是说跳到这个terminal的话,可以直接让它跳回到这个初始状态,那假如说要是这个match的状态的话,又该怎么办呢?所以接下来我们要做一个单独的判定。
02:08
这里面我们判断。判断。当前。状态的特殊情况直接进行跳转。所以这里我们可以进行一个if,当前的next state如果直接就等于了。state.match的话。那我们当前需要输出一个报警信息,而且还要跳转回S2状态,哎,那跳转回SS2状态的话,那我们知道就应该前一个状态。既然当前啊,新来了一个数据之后,能够跳转到match的,那肯定前一个状态就应该是S2状态嘛,那我们直接不更新就完了嘛,诶所以这里其实这个跳转就是不更新就完事,因为我们要跳转的话,应该是要把current state要进行一个覆盖,Next state要覆盖之前的state啊,就是我们的状态跳转是先获取到了该跳转到哪个状态,真正的跳转还要覆盖当前我们的这个状态变量。
03:16
所以现在我们只要不覆盖就相当于是没有跳整。所以我们这里是。检测到了匹配。要。输出报警信息。另外当前我们要跳转回S2状态,那这里。不更新状态。就是。跳着回。S2。所以当前我们做的操作就是直接。Out点输出数据就可以了,那我们当前可以直接把当前value点。User ID当前这个用户,然后加一条报警信息,这个我们就简单写就可以了,连续三次登录失败,诶这就是我们基本的一个报警信息的输出,那这里。
04:10
还有其他的情况。如果当前next state。如果要是等于。我们的最终状态如果要等于terminal的话。那怎么办呢?诶,那其实我们知道,如果要是已经到达了当前的这个terminal状态的话,那应该是直接把当前的这个状态要更新成initial。而不是。更新成当前的NEX state啊,那那就是不能更新成terminal,直接更新成initial就可以了,这个terminal其实是没有用的啊,所以这里面我们可以。把它做一个状态的更新。直接将。状态。
05:00
更新为。初始。从。新开始检测。那这里我们要做的操作就是current state点。更新成state initial。啊,那另外还有最后一种情况,那就是既不是match也不是terminal,那其实就是在中间这三个状态之间。再进行再进行转移,哎,那所以NEX的状态下一个状态如果是这里边的某一个的话,那就相当于直接把这个状态覆盖掉ATE就可以了,那所以就是状态真正的做了一个跳转。所以这里是。状态覆盖跳转。Can't sit update。用当前下一个next state去进行一个覆盖,覆盖这样的话就真正实现了状态的调整。
06:05
啊,所以这就是当前我们利用一个自定义的状态机来实现对应的这样一个连续三次。登录失败检测的一个复杂事件处理的功能。那接下来我们可以直接运行一下,看看它的效果怎么样。好,这里我们多了一个非法字符,把它删掉。我们可以看到这里直接检测出来了。USER1的连续三次登陆失败和USER2的连续三次登陆失败啊,因为这里边我们的这个顺序是就是已经不按事件时间顺序去处理了,直接把这个六秒的登陆成功放在最后的话,那显然前面就已经是连续三次登陆失败了,那接下来我们测试可以把它再提前到。
07:00
前面来。我们可以把它放到这里来。然后再来重新运行一下,看一看效果怎么样,当前的这个USER2的连续三次登陆失败是否还是可以的。哎,我们看到现在就只检测到USER1的连续三次登陆失败。啊,那所以这样实现的结果跟之前我们直接调用C库cep结果是完全一致的。啊,那这就是关于底层的状态机实现的原理。我们也可以发现,CP确实是对复杂事件进行处理的非常强大而且非常高效的一个库,那它的底层其实是非常复杂的一个NFA,那通过这个例子我们也可以深刻的理解CP的原理。
我来说两句