drools执行指定的规则
1、背景
在我们编写drools
规则文件的过程中,可能会编写好多规则。drools
引擎在模式匹配的时候,可能一下子激活了好多规则,但是我只想执行某个指定的规则,那么这个时候该怎么操作呢?
2、方案
2.1 通过AgendaFilter来实现
我们知道,在drools
模式匹配的时候,会将所有的规则进行匹配,匹配成功的规则会放入到Agenda
(议程)中,而fireAllRules(AgendaFilter)
方法,可以传递一个AgendaFilter
对Agenda
中的激活的规则进行过滤。
2.2 通过entry-point来实现
使用entry-point
可以定义模式的数据源对应的入口点或事件流。这个不能完全实现,只是提供一个思路。
举个例子:
Api(api == "/users/info" ) from entry-point "first-entry-point"
Api api = new Api("/users/info", 100);
EntryPoint entryPoint = kieSession.getEntryPoint("second-entry-point");
entryPoint.insert(api);
kieSession.fireAllRules();
上面这个例子,虽然工作内存中存在
Api
这个对象,但是由于 规则中的 entry-point
和java代码中的entry-point不一致,规则是没有匹配成功的。3、实现 此处我们通过
AgendaFilter
来实现具体调用某个具体的规则。3.1 需求
我们存在一个
Api(api,invokedCnt)
对象规则一:工作内存中存在
Api
对象,且属性api=="/users/info"
。 规则二:工作内存中存在
Api
对象,且属性invokedCnt > 10
。我们向工作内存中插入一个
Api("/users/info",100)
,此时规则一和规则二都会匹配到,但是我只想执行规则二。3.2 drl 文件编写
package rulesimport com.huan.drools.Apirule "rule_agenda_filter_01"
when
$api: Api(api == "/users/info" )
then
System.out.println("当前执行的规则是: " + drools.getRule().getName());
endrule "rule_agenda_filter_02"
when
$api: Api(invokedCnt > 10)
then
System.out.println("当前执行的规则是: " + drools.getRule().getName());
end
3.3 部分java代码
Api api = new Api("/users/info", 100);
kieSession.insert(api);
// 所有模式匹配成功后的规则回进入到agenda中,然后通过AgendaFilter过滤出需要执行的规则
kieSession.fireAllRules(new AgendaFilter() {
@Override
public boolean accept(Match match) {
String ruleName = match.getRule().getName();
return Objects.equals(ruleName, "rule_agenda_filter_02");
}
});
可以看到此处通过
AgendaFilter
进行了规则的过滤,只执行rule_agenda_filter_02
规则。注意:
此处虽然是一个过滤,但是并不意味着只有rule_agenda_filter_02
规则是激活的,而是所有满足条件的规则都是激活的。3.4 运行结果
当前执行的规则是: rule_agenda_filter_02
可以看到实现了我们想要的结果。
4、完整代码 【drools执行指定的规则】https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-invoked-specify-rule
推荐阅读
- 性能环境之docker操作指南1(全网最全)
- 致命错误(第463行的C:\xampp\htdocs\AKS_Shop\wp-includes\Requests\Transport\cURL.php中超过30秒的最大执行时间)
- drools中then部分的写法
- 红帽Linux入门指南第二期(Linux的基本使用)
- SSE图像算法优化系列三十一(Base64编码和解码算法的指令集优化(C#自带函数的3到4倍速度)。)
- MySQL 不完全入门指南
- 红帽Linux入门指南第一期(红帽 RHEL 8.0 操作系统安装步骤详解)
- 接口测试进阶接口脚本使用--apipost(预/后执行脚本)
- 2020年最佳IOS应用开发工具的终极指南
- 关于静态代码块的执行顺序,很简单的一道题,应该所有人都会吧()