20.2. 使用 Maven 创建和执行 DRL 规则
您可以使用 Maven archetypes 创建 DRL 文件与规则,并将 archetypes 与 Red Hat Process Automation 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.java
my-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
格式创建一个规则文件。以下
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 会话是由
KBase1
KIE 基础实例化,以及来自KBase2
的 KIE 会话。KBase2
中的 KIE 会话是一个无状态
KIE 会话,这意味着之前调用 KIE 会话(之前会话状态)中的数据会在会话调用之间丢弃。规则
资产的软件包包括在 KIE 基础中。当您以这种方式指定软件包时,您必须将 DRL 文件组织到反映指定软件包的文件夹结构中。在
my-app/pom.xml
配置文件中,指定应用程序所需的库。提供 Red Hat Process Automation 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 Process Automation Manager 中的 Maven 依赖项和 BOM(主要的资料)的详情,请参考 Red Hat Process Automation 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