drools中使用function
2022-05-14 21:53
741 查看
一、背景
当我们在
drools中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个
function来调用呢?那么在
drools中如何自定义
function?
二、需求
1、当我们的工作内存中存在
Person对象时,则需要调用
drl function来判断用户是否可以玩游戏。当
Person#age >= 18时可以玩。
2、在
then后面调用
java的
静态方法。
三、前置知识
1、function语法结构
function 返回值类型 方法名(方法参数){ 方法体 }
函数的定义需要放置在
drl文件中,并且是在规则文件的
then之后进行调用。
2、drl文件中如何调用java的静态方法
- import 类的全限定名。
- 在
then
的部分使用类名.静态方法名
四、实现
1、项目结构
2、引入drools依赖
<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文件
<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实体类
@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/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
相关文章推荐
- php strlen与mb_strlen的区别。function_exists()与isset()区别、 preg_match()、in_array、:$_char_pattren使用方法
- js函数使用技巧之 setTimeout(function(){},0)
- Flex combox labelFunction 使用示例
- vuejs路由使用的问题Error in render function: "TypeError: Cannot read property 'matched' of undefined"
- 宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
- Javascript 使用function定义构造函数
- Drools6 基本使用 -- 1
- VS2010中使用sprintf出现warning C4997: 'sprintf': This function or variable may be unsafe.
- variadic function 的使用
- Javascript使用function创建类的两种方法(推荐)
- 使用std::function和std::bind写的观察者模式
- 使用typeof判断function是否存在于上下文
- 如何使用register_shutdown_function()捕获PHP致命错误?
- drools规则引擎的简单使用
- Pytorch 的损失函数Loss function使用详解
- 为什么不能用drop function add 去删除函数? 因为不能使用 mysql中的保留字!
- 使用 聚合函数(aggregate function)时,SQL语句的返回值的注意事项
- 细说;(function ($, undefined){ })(jQuery); 的使用
- Boost库之function的使用
- WPF-005:关于使用PageFunction导航中KeepAlive的使用