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

在drools中使用函数

时间:2023-04-01 15:55:06 Java

一、背景我们在drools中写规则的时候,有时候会出现重复的代码,那么能否把这些重复的代码抽取出来,封装成一个函数来调用呢?那么如何在drools中自定义函数呢?二、需求1、当我们的工作记忆中有一个Person对象时,我们需要调用drl函数来判断用户是否可以玩游戏。Person#age>=18时可播放。2.之后调用java的静态方法。三、前置知识1、函数语法结构函数返回值类型方法名(方法参数){方法体}函数的定义需要放在drl文件中,在rule文件中then之后调用。2.如何在drl文件中调用java静态方法导入类的全限定名。在then部分使用类名。静态方法名4.实现1.项目结构2.引入drools依赖类型>7??.69.0.Finalimportorg.droolsdrools-compilerorg.droolsdrools-mvel/dependencies>省略一些不重要的依赖,例如logback和lombok。3、编写kmodule.xml文件4、编写Person实体类@Data@AllArgsConstructorpublicclassPerson{privateStringname;privateIntegerage;}5、drlfunction编写6、编写测试类publicclassDroolsApplication{publicstaticvoidmain(String[]args){KieServiceskieServices=KieServices.get();KieContainerkieContainer=kieServices.getKieClasspathContainer();KieSessionkieSession=kieContainer.newKieSession("function-ksession");kieSession.addEventListener(newDebugRuleRuntimeEventListener());Personperson=newPerson("张三",16);kieSession.insert(人);kieSession.fireAllRules();kieSession.dispose();}}7.查看运行结果至此我们的自定义函数就完成了。5.假设我想调用when阶段的函数。上面的功能是可以实现的,但是需要通过eval来实现。但是需要通过eval来实现并不好,性能也很差。例子:rule"rule_eval"when$person:Person()//eval也可以调用java的静态方法eval(playGameOk($person))//这个也可以调用,但是得到的结果不会进行模式匹配,但是可以用于以下模式匹配条件$playGameOk:Boolean()fromplayGameOk($person)thenSystem.out.println("ok");不推荐endeval参考链接:https://stackoverflow.com/questions/17487725/how-much-of-a-performance-hit-does-eval-cause-in-drools6.完整代码https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-drl-function七、参考链接1,https://stackoverflow.com/questions/17487725/how-much-of-a-performance-hit-does-eval-cause-in-drools2,https://docs.drools.org/7.69.0.Final/drools-docs/html_single/index.html#drl-functions-con_drl-rules