drools中使用function的方法小结

目录

  • 一、背景
  • 二、需求
  • 三、前置知识
    • 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语法结构
        drools中使用function的方法小结
        文章图片

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

        【drools中使用function的方法小结】函数的定义需要放置在drl文件中,并且是在规则文件的then之后进行调用。

        2、drl文件中如何调用java的静态方法
        • import 类的全限定名。
        • then的部分使用 类名.静态方法名

        四、实现
        1、项目结构
        drools中使用function的方法小结
        文章图片


        2、引入drools依赖
        org.droolsdrools-bompom7.69.0.Finalimportorg.droolsdrools-compilerorg.droolsdrools-mvel

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

        3、编写kmodule.xml文件


        4、编写Person实体类
        @Data@AllArgsConstructorpublic class Person {private String name; private Integer age; }


        5、drl function编写
        drools中使用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、查看运行结果
        drools中使用function的方法小结
        文章图片

        到此我们的自定义function功能就完成了。

        五、假设我想在when阶段调用function 对于上面这个功能是可以实现的,但是需要借助eval来实现,不过需要通过eval来实现是不好的,而且性能也差。
        举例:
        rule "rule_eval"when$person: Person()// eval 也可以调用java的静态方法eval(playGameOk($person))thenSystem.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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

          推荐阅读