一、背景
当我们在 drools 中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个 function 来调用呢?那么在 drools 中如何自定义 function ?
二、需求
1、当我们的工作内存中存在 Person 对象时,则需要调用 drl function 来判断用户是否可以玩游戏。当 Person#age >= 18 时可以玩。
2、在 then 后面调用 java 的 静态方法 。
三、前置知识
1、function语法结构
1 2 3 |
function 返回值类型 方法名(方法参数){ 方法体 } |
函数的定义 需要放置在 drl 文件中,并且是在规则文件的 then 之后进行调用。
2、drl文件中如何调用java的静态方法
import 类的全限定名。 在 then 的部分使用 类名.静态方法名
四、实现
1、项目结构
2、引入drools依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<dependencyManagement> <dependencies> <dependency> <groupId>org.drools</groupId> <artifactId>drools-bom</artifactId> <type>pom</type> <version> 7.69 . 0 .Final</version> <scope> import </scope> </dependency> </dependencies> </dependencyManagement>
<dependencies> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-mvel</artifactId> </dependency> </dependencies> |
一些不重要的依赖省略了,比如 logback和lombok 。
3、编写kmodule.xml文件
1 2 3 4 5 |
< kmodule xmlns = "http://www.drools.org/xsd/kmodule" > < kbase name = "function-kabse" packages = "rules" default = "false" > < ksession name = "function-ksession" default = "false" type = "stateful" /> </ kbase > </ kmodule > |
4、编写Person实体类
1 2 3 4 5 6 |
@Data @AllArgsConstructor public class Person { private String name; private Integer age; } |
5、drl function编写
6、编写测试类
1 2 3 4 5 6 7 8 9 10 11 12 |
public class DroolsApplication { public static void main(String[] args) { KieServices kieServices = KieServices.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer(); KieSession kieSession = kieContainer.newKieSession( "function-ksession" ); kieSession.addEventListener( new DebugRuleRuntimeEventListener()); Person person = new Person( "张三" , 16 ); kieSession.insert(person); kieSession.fireAllRules(); kieSession.dispose(); } } |
7、查看运行结果
到此我们的自定义function功能就完成了。
五、假设我想在when阶段调用function
对于上面这个功能是可以实现的,但是需要借助 eval 来实现,不过需要通过 eval 来实现是不好的,而且性能也差。
举例:
1 2 3 4 5 6 7 8 |
rule "rule_eval" when $person: Person() // eval 也可以调用java的静态方法 eval(playGameOk($person)) then System.out.println("ok"); end |
不推荐使用eval
参考链接: https://stackoverflow.com/questions/17487725/how-much-of-a-performance-hit-does-eval-cause-in-drools
六、完整代码
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-drools
2、https://docs.drools.org/7.69.0.Final/drools-docs/html_single/index.html#drl-functions-con_drl-rules
到此这篇关于drools中使用function的文章就介绍到这了,更多相关drools中使用function内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
原文链接:https://www.cnblogs.com/huan1993/p/16271690.html
查看更多关于drools中使用function的方法小结的详细内容...