20.2. 使用 Maven 创建和执行 DRL 规则
您可以使用 Maven archetypes 创建 DRL 文件及规则,并将 archetypes 与 Red Hat Decision Manager 决策服务集成。如果您已将外部 Maven archetypes 用于决策服务,并且希望继续相同的工作流,则创建 DRL 规则的方法很有用。如果您还没有使用这个方法,则建议红帽决策管理器的 Business Central 界面创建 DRL 文件和其他规则资产。
流程
进入要创建 Maven archetype 并运行以下命令的目录:
mvn archetype:generate -DgroupId=com.sample.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
这会创建一个带有以下结构的目录
my-app:my-app |-- pom.xml `-- src |-- main | `-- java | `-- com | `-- sample | `-- app | `-- App.java `-- test `-- java `-- com `-- sample `-- app `-- AppTest.javamy-app目录包含以下关键组件:-
用于存储应用程序源的
src/main目录 -
用于存储测试源的
src/test目录 -
带有项目配置的
pom.xml文件
-
用于存储应用程序源的
创建规则或规则在 Maven archetype 中操作的 Java 对象。
在本例中,
Person.java文件是在my-app/src/main/java/com/sample/app目录中创建的 Person.java 文件。Person类包含 getter 和 setter 方法,用于设置和检索第一个名称、姓氏、每小时速率和个人的 wage:package com.sample.app; public class Person { private String firstName; private String lastName; private Integer hourlyRate; private Integer wage; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Integer getHourlyRate() { return hourlyRate; } public void setHourlyRate(Integer hourlyRate) { this.hourlyRate = hourlyRate; } public Integer getWage(){ return wage; } public void setWage(Integer wage){ this.wage = wage; } }以
my-app/src/main/resources/com/sample/app格式创建一个规则文件。DRL 文件必须至少包含软件包规格、规则或规则要使用的数据对象导入列表,以及带有条件和动作的一个或多个规则。以下
Wage.drl文件包含导入Person类的Wage规则,计算出 wage 和 hourly 速率值,并根据结果显示一条消息:package com.sample.app; import com.sample.app.Person; dialect "java" rule "Wage" when Person(hourlyRate * wage > 100) Person(name : firstName, surname : lastName) then System.out.println("Hello " + name + " " + surname + "!"); System.out.println("You are rich!"); end在
my-app/src/main/resources/META-INF目录中,创建包含以下内容的kmodule.xml元数据文件:<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns="http://www.drools.org/xsd/kmodule"> </kmodule>
这个
kmodule.xml文件是一个 KIE 模块描述符,它选择到 KIE 基础并配置会话。此文件可让您定义和配置一个或多个 KIE 基础,并在特定 KIE 基础中包含特定软件包的 DRL 文件。您还可以从每个 KIE 基础中创建一个或多个 KIE 会话。以下示例显示了更高级的
kmodule.xml文件:<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="KBase1" default="true" eventProcessingMode="cloud" equalsBehavior="equality" declarativeAgenda="enabled" packages="org.domain.pkg1"> <ksession name="KSession1_1" type="stateful" default="true" /> <ksession name="KSession1_2" type="stateful" default="true" beliefSystem="jtms" /> </kbase> <kbase name="KBase2" default="false" eventProcessingMode="stream" equalsBehavior="equality" declarativeAgenda="enabled" packages="org.domain.pkg2, org.domain.pkg3" includes="KBase1"> <ksession name="KSession2_1" type="stateless" default="true" clockType="realtime"> <fileLogger file="debugInfo" threaded="true" interval="10" /> <workItemHandlers> <workItemHandler name="name" type="new org.domain.WorkItemHandler()" /> </workItemHandlers> <listeners> <ruleRuntimeEventListener type="org.domain.RuleRuntimeListener" /> <agendaEventListener type="org.domain.FirstAgendaListener" /> <agendaEventListener type="org.domain.SecondAgendaListener" /> <processEventListener type="org.domain.ProcessListener" /> </listeners> </ksession> </kbase> </kmodule>这个示例定义了两个 KIE 基础。两个 KIE 会话是由
KBase1KIE 基础实例化,以及来自KBase2的 KIE 会话。KBase2中的 KIE 会话是一个无状态KIE 会话,这意味着之前调用 KIE 会话(之前会话状态)中的数据会在会话调用之间丢弃。规则资产的软件包包括在 KIE 基础中。当您以这种方式指定软件包时,您必须将 DRL 文件组织到反映指定软件包的文件夹结构中。在
my-app/pom.xml配置文件中,指定应用程序所需的库。提供 Red Hat Decision Manager 依赖项,以及应用程序的组ID、工件 ID和版本(GAV)。<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sample.app</groupId> <artifactId>my-app</artifactId> <version>1.0.0</version> <repositories> <repository> <id>jboss-ga-repository</id> <url>http://maven.repository.redhat.com/ga/</url> </repository> </repositories> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>VERSION</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-mvel</artifactId> <version>VERSION</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>VERSION</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project>有关 Red Hat Decision Manager 中的 Maven 依赖项和 BOM( Materials 的基础)的信息,请参阅 Red Hat Decision Manager 和 Maven 库版本之间的映射是什么?
-
使用
my-app/src/test/java/com/sample/app/AppTest.java中的testApp方法来测试规则。AppTest.java文件默认由 Maven 创建。 在
AppTest.java文件中,添加所需的导入语句来导入 KIE 服务、KIE 容器和 KIE 会话。然后,载入 KIE 基础、插入事实,并从将事实模型传递给规则的testApp()方法执行规则。import org.kie.api.KieServices; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; public void testApp() { // Load the KIE base: KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession(); // Set up the fact model: Person p = new Person(); p.setWage(12); p.setFirstName("Tom"); p.setLastName("Summers"); p.setHourlyRate(10); // Insert the person into the session: kSession.insert(p); // Fire all rules: kSession.fireAllRules(); kSession.dispose(); }在 Maven archetype 中创建并保存所有 DRL 资产后,导航到命令行中的
my-app目录,再运行以下命令来构建您的文件:mvn clean install
如果构建失败,请解决命令行错误消息中描述的任何问题,并尝试验证文件,直到构建成功为止。
文件构建成功后,请运行以下命令在本地执行规则。将
com.sample.app替换为您的软件包名称。mvn exec:java -Dexec.mainClass="com.sample.app.App"
- 检查规则以确保它们正确执行,并处理文件中所需的所有更改。
要将新规则资产与红帽决策管理器中的现有项目集成,您可以将新的 Maven 项目作为知识 JAR(KJAR)编译,并将它添加为 Business Central 中项目的 pom.xml 文件中的依赖关系。要访问 Business Central 中的项目 pom.xml 文件,您可以选择项目中任何现有资产,然后在屏幕左侧的 Project Explorer 菜单中,单击 Customize View gear 图标并选择 Repository View → pom.xml。