Drools - 规则编写
如果您看到 Hello World 项目 (Sample.drl) 中编写的默认规则,其中使用了很多关键字,我们现在将对此进行解释。
Sample.drl
包 − 每个规则都以包名开头。包充当规则的命名空间。包内的规则名称必须是唯一的。规则中的包与 Java 中的包类似。
导入语句 − 无论您想将规则应用于哪些事实,都需要导入这些事实。例如,com.sample.DroolsTest.Message;在上面的例子中。
规则定义 − 它由规则名称、条件和结果组成。Drools 关键字是 rule、when、then 和 end。在上面的例子中,规则名称是"Hello World"和"GoodBye"。when 部分是规则中的条件,then 部分是结果。在规则术语中,when 部分也称为规则的 LHS(左侧),then 部分也称为规则的 RHS(右侧)。
现在让我们了解一下用于加载 Drools 和执行规则的 Java 文件中使用的术语。
知识库
知识库是一个管理规则、流程和内部类型集合的接口。它包含在包 org.drools.KnowledgeBase 中。在 Drools 中,这些通常称为 知识定义 或 知识。知识定义被分组到 知识包 中。可以添加或删除知识定义。知识库的主要目的是存储和重用它们,因为它们的创建成本很高。知识库提供了创建知识会话的方法。
知识会话
知识会话是从知识库中检索的。它是与 Drools 引擎交互的主要接口。知识会话可以有两种类型 −
无状态知识会话
有状态知识会话
无状态知识会话
无状态知识会话是形成最简单用例的无状态会话,不使用推理。无状态会话可以像函数一样调用,向其传递一些数据,然后接收一些结果。无状态会话的常见示例包括 −
Validation
此人是否有资格获得抵押贷款?
Calculation
计算抵押贷款溢价。
路由和过滤
将传入消息(例如电子邮件)过滤到文件夹中。
将传入消息发送到目的地
有状态知识会话
有状态会话的寿命更长,并允许随着时间的推移进行迭代更改。有状态会话的一些常见用例包括 −
Monitoring
股票市场监控和分析,用于半自动购买。
Diagnostics
故障查找、医疗诊断
Logistics
包裹跟踪和交付配置
知识构建器
KnoledgeBuilder 接口负责从知识定义(规则、流程、类型)构建 KnowledgePackage。它包含在包 org.drools.builder.KnowledgeBuilder 中。知识定义可以采用多种格式。如果构建过程中出现任何问题,KnowledgeBuilder 将通过以下两个方法报告错误:hasErrors 和 getError。
下图解释了该过程
在上面的例子中,由于我们采用无状态知识会话的简单示例,我们在会话中插入了事实,然后调用 fireAllRules() 方法,您将看到输出。
在有状态知识会话的情况下,一旦触发规则,有状态知识会话对象必须调用方法 dispose() 来释放会话并避免内存泄漏。