drools中使用function的方法小结

网友投稿 533 2022-07-29


目录一、背景二、需求三、前置知识1、function语法结构2、drl文件中如何调用java的静态方法四、实现1、项目结构2、引入drools依赖3、编写kmodule.xml文件4、编写Person实体类5、drl function编写6、编写测试类7、查看运行结果五、假设我想在when阶段调用function六、完整代码七、参考链接

一、背景

当我们在drools中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个function来调用呢?那么在drools中如何自定义function?

二、需求

1、当我们的工作内存中存在Person对象时,则需要调用drl function来判断用户是否可以玩游戏。当Person#age >= 18时可以玩。2、在then 后面调用java的静态方法。

三、前置知识

1、function语法结构

function 返回值类型 方法名(方法参数){

方法体

}

函数的定义需要放置在drl文件中,并且是在规http://则文件的then之后进行调用。

2、drl文件中如何调用java的静态方法

import 类的全限定名。在then的部分使用 类名.静态方法名

四、实现

1、项目结构

2、引入drools依赖

org.drools

drools-bom

pom

7.69.0.Final

import

org.drools

drools-compiler

org.drools

drools-mvel

一些不重要的依赖省略了,比如logback和lombok。

3、编写kmodule.xmhttp://l文件

4、编写Person实体类

@Data

@AllArgsConstructor

public class Person {

private String name;

private Integer age;

}

5、drl function编写

6、编写测试类

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来实现是不好的,而且性能也差。举例:

rule "rule_eval"

when

$person: Person()

// eval 也可以调用java的静态方法

eval(playGameOk($person))

then

System.out.println("ok");

end

不推荐使用eval参考链接:https://stackoverflow.com/questions/174http://87725/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.comhttp:///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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深入浅析drools中Fact的equality modes
下一篇:Java中synchronized锁升级的过程(java自旋锁和synchronized)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~