Drools CEP实现规则联动
背景
我们想实现如下的场景:
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);
...