文章来源: Getting Started: Drools Document
本文简介:本文翻译自Drools 8.44.0.Final版本的官方文档。本文介绍了如何使用Drools,包括如何配置安装环境、如何从远程库安装Drools8、DMN组件的信息、选择部署平台的指南等相关教程
翻译初衷:由于国内缺乏Drools (尤其是8.x版本) 相关资料,没有一条龙式的安装指南,且8.x版本同7.x版本的官方文档有较大差异,因此译者认为对8.x版本的官网文档进行翻译和完善是有必要的
第一个规则项目
安装环境配置
下述JDK和Maven的安装和配置详见:《Drools8.44.0官方文档翻译(一):介绍与源码安装教程》中【从源代码安装Drools】一节的前两步骤
- 正确配置了
JAVA_HOME
参数的JDK11+ - Apache Maven 3.8.6+(建议使用最新版本)
- (可选)安装IDE,如IntelliJ IDEA、VSCode或Eclipse
使用Maven Archetype创建一个新项目
使用下述代码创建一个新项目(Drools8.44.0.Final版本)
mvn archetype:generate -DarchetypeGroupId=org.kie -DarchetypeArtifactId=kie-drools-exec-model-ruleunit-archetype -DarchetypeVersion=8.44.0.Final
在命令执行过程中,以交互方式输入特性值(如下图所示):
Define value for property 'groupId': org.example
Define value for property 'artifactId': my-project
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' org.example: :
...
Y: : Y
...
[INFO] BUILD SUCCESS
之后Drools8.44.0.Final就会被自动安装。安装成功后可以在安装目录下的my-project
文件夹中看到src
文件夹和pom.xml
文件(如下图所示)
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-ruleunits-engine</artifactId>
</dependency>
...
</dependencies>
注:您仍然可以使用传统的Drools 7样式规则,而不使用规则单元。在本例中,使用kie-drools-exec-model-archetype。
在通过archetype安装的Drools文件中包含一个DRL文件作为示例src/main/resources/org/example/rules. drl
(如下所示):
package org.example;
unit MeasurementUnit;
rule "will execute per each Measurement having ID color"
when
/measurements[ id == "color", $colorVal : val ]
then
controlSet.add($colorVal);
end
query FindColor
$m: /measurements[ id == "color" ]
end
此规则检查传入的Measurement
数据,当其为颜色信息时,将其值存储在全局变量controlSet
中。
当when
部分实现模式匹配时,then
部分定义的操作会被执行。
接下来,找到在规则中定义了unit MeasurementUnit
的src/main/java/org/example/MeasurementUnit.java
文件(一个rule unit
文件)。该文件分组定义了数据源、全局变量和DRL规则(如下所示):
public class MeasurementUnit implements RuleUnitData {
private final DataStore<Measurement> measurements;
private final Set<String> controlSet = new HashSet<>();
...
rules.drl
中的/measurements
绑定到MeasurementUnit
类中的measurements
字段,由此也就可以知道rules.drl
中的/measurements
的数据类型是Measurement
。这个类还定义了一个全局变量controlSet
。
然后,src/main/java/org/example/Measurement.java
是规则中使用的Java bean类。这样的对象被称为事实(Fact)。
最后,src/test/java/org/example/RuleTest.java
是执行规则的测试用例。在这里,您可以了解在您自己的应用程序中使用的基本API的用法。
MeasurementUnit measurementUnit = new MeasurementUnit();
RuleUnitInstance<MeasurementUnit> instance = RuleUnitProvider.get().createRuleUnitInstance(measurementUnit);
如上,创建MeasurementUnit
实例。然后使用RuleUnitProvider
创建一个带有MeasurementUnit
实例的RuleUnitInstance
。
measurementUnit.getMeasurements().add(new Measurement("color", "red"));
measurementUnit.getMeasurements().add(new Measurement("color", "green"));
measurementUnit.getMeasurements().add(new Measurement("color", "blue"));
如上,将Measurement
事实添加到measurementUnit.measurements
中。这意味着事实数据将被插入Drools规则引擎。
List<Measurement> queryResult = instance.executeQuery("FindColor").stream().map(tuple -> (Measurement) tuple.get("$m")).collect(toList());
如上,执行名为FindColor
的查询。执行查询时,将自动触发与插入的事实匹配的规则。如果你只想触发规则而不想查询,你可以调用instance.fire()
。
instance.close();
最后,调用close()
以释放RuleUnitInstance
保留的资源。
让我们使用mvn clean test
运行测试。
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.example.RuleTest
2022-06-13 12:49:56,499 [main] INFO Creating RuleUnit
2022-06-13 12:49:56,696 [main] INFO Insert data
2022-06-13 12:49:56,700 [main] INFO Run query. Rules are also fired
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.411 s - in org.example.RuleTest
现在您可以在这个项目中添加自己的规则和事实!
注:规则项目需要由mvn编译阶段触发的代码生成。如果直接在IDE中运行RuleTest.java,则可能需要先运行mvn compile。