Drools - 规则编写

如果您看到 Hello World 项目 (Sample.drl) 中编写的默认规则,其中使用了很多关键字,我们现在将对此进行解释。

Default Rule

Sample.drl

  • − 每个规则都以包名开头。包充当规则的命名空间。包内的规则名称必须是唯一的。规则中的包与 Java 中的包类似。

  • 导入语句 − 无论您想将规则应用于哪些事实,都需要导入这些事实。例如,com.sample.DroolsTest.Message;在上面的例子中。

  • 规则定义 − 它由规则名称、条件和结果组成。Drools 关键字是 rule、when、thenend。在上面的例子中,规则名称是"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 将通过以下两个方法报告错误:hasErrorsgetError

下图解释了该过程

KnoledgeBuilder

在上面的例子中,由于我们采用无状态知识会话的简单示例,我们在会话中插入了事实,然后调用 fireAllRules() 方法,您将看到输出。

在有状态知识会话的情况下,一旦触发规则,有状态知识会话对象必须调用方法 dispose() 来释放会话并避免内存泄漏。