当前位置: 首页 > 后端技术 > Java

drools执行指定的规则

时间:2023-04-01 15:58:28 Java

1。背景在编写drools规则文件的过程中,我们可能会编写很多规则。drools引擎在模式匹配的时候可能会一次性激活很多条规则,而我只想执行指定的一条规则,那么这个时候应该怎么办呢?2、方案2.1是通过AgendaFilter实现的。我们知道drools模式匹配时,会匹配所有的规则,匹配成功的规则会放入Agenda(议程)中,fireAllRules(AgendaFilter)方法可以通过一个AgendaFilter过滤Agenda中活跃的规则。2.2使用入口点实现数据源对应的入口点或事件流可以使用入口点定义模式。这个不能完全实现,只是提供一个思路。例如:Api(api=="/users/info")来自入口点"first-entry-point"Apiapi=newApi("/users/info",100);EntryPointentryPoint=kieSession.getEntryPoint("second-entry-point");entryPoint.insert(api);kieSession.fireAllRules();在上面的例子中,虽然Api对象存在于工作内存中,但是由于规则中的entry-point和entry-point不一致,规则匹配不成功。3.实现这里我们使用AgendaFilter来实现对特定规则的特定调用。3.1需求我们有一个Api(api,invokedCnt)对象规则一:工作内存中有一个Api对象,属性api==”/users/info”。规则2:workingmemory中有一个Api对象,属性invokedCnt>10。我们往workingmemory中插入一个Api("/users/info",100),规则1和2都会匹配,但是我只想执行规则2。3.2drl文件写入包rulesimportcom.huan.drools.Apirule"rule_agenda_filter_01"when$api:Api(api=="/users/info")thenSystem.out.println("当前执行的规则是:"+drools.getRule().getName());endrule"rule_agenda_filter_02"when$api:Api(invokedCnt>10)thenSystem.out.println("当前执行的规则是:"+drools.getRule().getName());end3.3部分java代码Apiapi=newApi("/users/info",100);kieSession.insert(api);//模式匹配成功后的所有规则返回到议程中,然后过滤掉通过AgendaFilter执行的规则kieSession.fireAllRules(newAgendaFilter(){@Overridepublicbooleanaccept(Matchmatch){StringruleName=match.getRule().getName();returnObjects.equals(ruleName,"rule_agenda_filter_02");}});可以看到这里规则被AgendaFilter过滤了,只执行了rule_agenda_filter_02规则。注意:虽然这是一个过滤器,但并不是说只有rule_agenda_filter_02规则被激活,而是所有符合条件的规则都被激活。3.4运行结果当前执行的规则为:rule_agenda_filter_02可以看到已经达到了我们想要的结果。4.完整代码https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-invoked-specify-rule