Apache flink Flink CEP:FollowedBy模式:同一事件多次循环该模式

Apache flink Flink CEP:FollowedBy模式:同一事件多次循环该模式,apache-flink,flink-cep,Apache Flink,Flink Cep,我是Flink CEP的新手,一直在玩弄这些模式,以便更好地理解它们。 我有一个“begin”和“followedBy”的简单例子。 我注意到,在followedBy的情况下,同一事件在它中循环多次。 我错过了什么 Pattern match\u win=Pattern.begin(“first”).where(新的SimpleCondition(){ 公共布尔筛选器(HitDTO HitDTO)引发异常{ 布尔结果=假; if(hitDTO.getHitScore()==4) { System

我是Flink CEP的新手,一直在玩弄这些模式,以便更好地理解它们。 我有一个“begin”和“followedBy”的简单例子。 我注意到,在followedBy的情况下,同一事件在它中循环多次。 我错过了什么

Pattern match\u win=Pattern.begin(“first”).where(新的SimpleCondition(){

公共布尔筛选器(HitDTO HitDTO)引发异常{
布尔结果=假;
if(hitDTO.getHitScore()==4)
{
System.out.println(“第一个:“+hitDTO+”:“+hitDTO.getHitScore());
结果=真;
}
返回结果;
}
}).followerby(“next”).where(新的SimpleCondition(){
公共布尔筛选器(HitDTO HitDTO)引发异常
{
布尔结果=假;
if(hitDTO.getHitScore()==6)
{
System.out.println(“下一步:“+hitDTO+”:“+hitDTO.getHitScore());
结果=真;
}
返回结果;
}
});
我在4,4,6通过

并行度设置为1

StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment().setParallelism(1)

然而,这是我在模式中的打印输出日志中看到的,其中6在仅传入一次时循环了4次

第一:com.rs.dto。HitDTO@17619295:4

第一:com.rs.dto。HitDTO@c108f70:4

下一步:com.rs.dto。HitDTO@5d13aab8:6

下一步:com.rs.dto。HitDTO@5d13aab8:6

下一步:com.rs.dto。HitDTO@5d13aab8:6

下一步:com.rs.dto。HitDTO@5d13aab8:6

只是想知道为什么同一事件会循环多次,但结果是正确的


感谢您的回答。

尝试将模式匹配到输入序列的过程通常会涉及对模式的各个组件的多次评估。模式匹配就是这样工作的:模式被编译到有限状态机,并且输入可能通过该FSM的所有可能路径都会被考虑在内d、 寻找通向终端的路径,匹配状态。如果您在定义模式时不小心,这可能会导致组合爆炸式的努力。

感谢David的回答。我通过了4两次。我看到它被“first”评估了两次,太好了!下一次当我通过6时,它被评估为“Next”“在后面,这很好。然而,让我困惑的是,为什么在同一次运行中,它会被额外评估3次。我的设置中有什么导致它的吗?在它被接受并退出过滤器后,不应该让它为该事件反复检查,对吗?尝试将
。followerdby(“next”)
替换为
。next(“next”)
,并比较发生的情况。我很想自己更好地理解细节,所以我重写了一点,以更好地揭示模式匹配器正在进行的行走。
    public boolean filter(HitDTO hitDTO) throws Exception {
        boolean result = false;
        if (hitDTO.getHitScore() == 4)
        {
            System.out.println("First:" + hitDTO + ": " + hitDTO.getHitScore());
            result = true;
        }
        return result;
    }
}).followedBy("next").where(new SimpleCondition<HitDTO>(){

    public boolean filter(HitDTO hitDTO) throws Exception
    {
        boolean result = false;

        if (hitDTO.getHitScore() == 6)
        {
            System.out.println("Next:" + hitDTO+ ": " + hitDTO.getHitScore());
            result = true;
        }
        return result;
    }
});