美文网首页
Drools CEP实现规则联动

Drools CEP实现规则联动

作者: 淡淡的小番茄 | 来源:发表于2021-07-13 15:08 被阅读0次

    背景

    我们想实现如下的场景:

    if(orgId ==11111){

      System.out.println("触发器已触发");

        if(hasProductLabels('101,102,103',$msg.getProductLabels())>0){

              System.out.println("执行条件已匹配");

        }else{

            System.out.println("执行条件未匹配");

        }

    }else{

        System.out.println("触发器未触发");

    }

    使用flink cep能很好的实现以上的逻辑,条件可以自由组合嵌套。了解了下,Drools嵌套只能通过中间状态来实现。

    Drools CEP实现规则联动

    我们先定义两个规则,第一个实现触发器的功能,执行优先级高。第二个规则是执行规则,当触发器规则匹配成功后才执行,执行优先级低于触发器规则。使用agenda-group将两个规则绑定到一起,其对应的互斥通过activation-group来实现, 使用salience定义规则执行优先级。

    示例代码如下:

    package drools.example;

    import org.drools.example.api.namedkiesession.Message;

    function int hasProductLabels(String deviceLabels,String labels){

      return deviceLabels.indexOf(labels)==-1?0:1;

    }

    rule "g1_mytest_trigger"

    agenda-group "org"

    salience 99

    when

    $msg : Message(orgId =='11111')

    then

    $msg.setTrigger(1);

    update($msg);

    end

    rule "g1_mytest"

    salience 0

    when

    $msg : Message(trigger==1)

    && eval(hasProductLabels('101,102,103',$msg.getProductLabels())>0)

    then

    System.out.println("===orgId:11111,orgKey:k11111,ruleName:g1_mytest===");

    end

    规则执行校验

    核心代码如下:

    ...

    FactHandle fact =  session.insert(msg);

    session.getAgenda().getAgendaGroup("org").setFocus();

    int i = session.fireAllRules();

    session.delete(fact);

    ...

    相关文章

      网友评论

          本文标题:Drools CEP实现规则联动

          本文链接:https://www.haomeiwen.com/subject/cqhspltx.html