第 60 章 执行规则
在确定了示例规则或在 Business Central 中创建自己的规则后,您可以在本地或 KIE 服务器上构建并部署相关的项目并在 KIE 服务器上执行规则,以测试规则。
先决条件
- 业务中心和 KIE 服务器已安装并运行。有关安装选项,请参阅 规划 Red Hat Process Automation Manager 安装。
流程
-
在 Business Central 中,前往 Menu
Design Projects 并点项目名称。 在项目 资产 页面右上角,单击 Deploy 以构建该项目,并将它部署到 KIE 服务器。如果构建失败,请解决屏幕底部的 Alerts 面板中描述的问题。
有关项目部署选项的更多信息,请参阅 打包和部署 Red Hat Process Automation Manager 项目。
注意如果项目中规则资产没有从可执行规则模型构建,请验证以下依赖项是否在项目的
pom.xml
文件中构建,并重新构建项目:<dependency> <groupId>org.drools</groupId> <artifactId>drools-model-compiler</artifactId> <version>${rhpam.version}</version> </dependency>
默认情况下,Red Hat Process Automation Manager 中的规则资产需要这个依赖项,从可执行规则模型构建。这个依赖关系包含在 Red Hat Process Automation Manager 核心打包中,但取决于 Red Hat Process Automation Manager 升级历史记录,您可能需要手动添加这个依赖关系来启用可执行规则模型行为。
有关可执行规则模型的更多信息,请参阅 打包和部署 Red Hat Process Automation Manager 项目。
在 Business Central 之外创建 Maven 或 Java 项目(如果尚未创建),您可将其用于在本地执行规则,或用作在 KIE 服务器上执行规则的客户端应用程序。该项目必须包含
pom.xml
文件以及执行项目资源的任何其他必要组件。有关 test 项目示例,请参阅 "创建和执行 DRL 规则的方法 "。
打开 test 项目或客户端应用程序的
pom.xml
文件,并添加以下依赖项(如果还没有添加):-
kie-ci
:启用客户端应用程序以使用ReleaseId
在本地加载 Business Central 项目数据 -
kie-server-client
:使您的客户端应用程序能够与 KIE 服务器上的资产远程交互 -
slf4j
:(可选)使您的客户端应用程序能够使用 Simple Logging Facade 用于 Java(SLF4J),以在与 KIE 服务器交互后返回调试信息
客户端应用程序
pom.xml
文件中的 Red Hat Process Automation Manager 7.13 的依赖项示例:<!-- For local execution --> <dependency> <groupId>org.kie</groupId> <artifactId>kie-ci</artifactId> <version>7.67.0.Final-redhat-00024</version> </dependency> <!-- For remote execution on KIE Server --> <dependency> <groupId>org.kie.server</groupId> <artifactId>kie-server-client</artifactId> <version>7.67.0.Final-redhat-00024</version> </dependency> <!-- For debug logging (optional) --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> </dependency>
对于这些工件的可用版本,请在 Nexus Repository Manager 在线搜索组 ID 和工件 ID。
注意考虑将 Red Hat Business Automation 材料清单(BOM)依赖项添加到项目
pom.xml
文件,而不是为每个依赖项指定 Red Hat Process Automation Manager <version
>。Red Hat Business Automation BOM 适用于 Red Hat Decision Manager 和 Red Hat Process Automation Manager。添加 BOM 文件时,项目中包含来自提供的 Maven 存储库的正确依赖项版本。BOM 依赖项示例:
<dependency> <groupId>com.redhat.ba</groupId> <artifactId>ba-platform-bom</artifactId> <version>7.13.5.redhat-00002</version> <scope>import</scope> <type>pom</type> </dependency>
有关 Red Hat Automation BOM 的更多信息,请参阅 Red Hat Process Automation Manager 和 Maven 库版本之间的映射是什么?
-
确保在客户端应用
pom.xml
文件中定义了包含模型类的工件依赖项,它们与部署的项目的pom.xml
文件中完全相同。如果模型类的依赖关系因客户端应用和项目之间有所不同,则可能会出现执行错误。要访问 Business Central 中的项目
pom.xml
文件,请在项目左侧选择任何现有资产,然后在屏幕左侧的 Project Explorer 菜单中,单击 Customize View gear 图标并选择 Repository Viewpom.xml。 例如,以下
Person
类依赖项同时出现在客户端和部署的项目pom.xml
文件中:<dependency> <groupId>com.sample</groupId> <artifactId>Person</artifactId> <version>1.0.0</version> </dependency>
如果您将
slf4j
依赖项添加到用于调试日志的客户端应用程序pom.xml
文件,请在相关类路径(例如,在 Maven 中的 src/main/resources/META-INF)上创建一个simplelogger.properties
文件(例如,在 Maven 中的src/main/resources/META-INF
):org.slf4j.simpleLogger.defaultLogLevel=debug
在您的客户端应用中,创建一个包含必要导入和
main()
方法的.java
主类,以加载 KIE 基础、插入事实和执行规则。例如,项目中的
Person
对象包含 getter 和 setter 方法,用于设置并检索一个人的名字、姓氏、每小时速率和分流。项目中的以下Wage
规则计算 wage 和 hourly 速率值,并根据结果显示消息:package com.sample; import com.sample.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
要在 KIE 服务器之外测试此规则(如果需要),请配置
.java
类以导入 KIE 服务、KIE 容器和 KIE 会话,然后使用main()
方法针对定义的事实模型触发所有规则:本地执行规则
import org.kie.api.KieServices; import org.kie.api.builder.ReleaseId; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.drools.compiler.kproject.ReleaseIdImpl; public class RulesTest { public static final void main(String[] args) { try { // Identify the project in the local repository: ReleaseId rid = new ReleaseIdImpl("com.myspace", "MyProject", "1.0.0"); // Load the KIE base: KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.newKieContainer(rid); 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(); } catch (Throwable t) { t.printStackTrace(); } } }
要在 KIE 服务器上测试此规则,请配置
.java
类,其导入和规则执行信息与本地示例类似,另外还指定 KIE 服务配置和 KIE 服务客户端详情:在 KIE 服务器上执行规则
package com.sample; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.kie.api.command.BatchExecutionCommand; import org.kie.api.command.Command; import org.kie.api.KieServices; import org.kie.api.runtime.ExecutionResults; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.server.api.marshalling.MarshallingFormat; import org.kie.server.api.model.ServiceResponse; import org.kie.server.client.KieServicesClient; import org.kie.server.client.KieServicesConfiguration; import org.kie.server.client.KieServicesFactory; import org.kie.server.client.RuleServicesClient; import com.sample.Person; public class RulesTest { private static final String containerName = "testProject"; private static final String sessionName = "myStatelessSession"; public static final void main(String[] args) { try { // Define KIE services configuration and client: Set<Class<?>> allClasses = new HashSet<Class<?>>(); allClasses.add(Person.class); String serverUrl = "http://$HOST:$PORT/kie-server/services/rest/server"; String username = "$USERNAME"; String password = "$PASSWORD"; KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(serverUrl, username, password); config.setMarshallingFormat(MarshallingFormat.JAXB); config.addExtraClasses(allClasses); KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(config); // Set up the fact model: Person p = new Person(); p.setWage(12); p.setFirstName("Tom"); p.setLastName("Summers"); p.setHourlyRate(10); // Insert Person into the session: KieCommands kieCommands = KieServices.Factory.get().getCommands(); List<Command> commandList = new ArrayList<Command>(); commandList.add(kieCommands.newInsert(p, "personReturnId")); // Fire all rules: commandList.add(kieCommands.newFireAllRules("numberOfFiredRules")); BatchExecutionCommand batch = kieCommands.newBatchExecution(commandList, sessionName); // Use rule services client to send request: RuleServicesClient ruleClient = kieServicesClient.getServicesClient(RuleServicesClient.class); ServiceResponse<ExecutionResults> executeResponse = ruleClient.executeCommandsWithResults(containerName, batch); System.out.println("number of fired rules:" + executeResponse.getResult().getValue("numberOfFiredRules")); } catch (Throwable t) { t.printStackTrace(); } } }
从项目目录中运行配置的
.java
类。您可以在开发平台(如 Red Hat CodeReady Studio)或命令行中运行该文件。Maven 执行示例(在项目目录中):
mvn clean install exec:java -Dexec.mainClass="com.sample.app.RulesTest"
Java 执行示例(在项目目录中)
javac -classpath "./$DEPENDENCIES/*:." RulesTest.java java -classpath "./$DEPENDENCIES/*:." RulesTest
- 在命令行中检查规则执行状态并在服务器日志中。如果有任何规则没有按预期执行,请检查项目中配置的规则,以及验证提供的数据的主类配置。