Drools CEP实现规则联动

2021-07-13  本文已影响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);

...

上一篇下一篇

猜你喜欢

热点阅读