第 44 章 执行规则
在 Business Central 中识别示例规则或创建自己的规则后,您可以构建和部署关联的项目,并在 KIE 服务器上执行规则来测试规则。
先决�件
- Business Central 和 KIE 服务器已安装并运行。有关安装选项,请参阅 规划 Red Hat Process Automation Manager 安装。
流程
-
在 Business Central 中,进入 Menu
Design Projects,然后点击项目名称。 在项目 资产 页面右上角,点 Deploy 以构建项目并将其部署到 KIE Server。如果构建失败,请解决屏幕底部的 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:(可选)使客户端应用程序能够使用简单日志记录 Facade for Java (SLF4J)在与 KIE 服务器交互后返回调试日志信息
客户端应用程序
pom.xml文件中的 Red Hat Process Automation Manager 7.9 的依赖项示例:<!-- For local execution --> <dependency> <groupId>org.kie</groupId> <artifactId>kie-ci</artifactId> <version>7.44.0.Final-redhat-00006</version> </dependency> <!-- For remote execution on KIE Server --> <dependency> <groupId>org.kie.server</groupId> <artifactId>kie-server-client</artifactId> <version>7.44.0.Final-redhat-00006</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 Manager (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.9.1.redhat-00003</version> <scope>import</scope> <type>pom</type> </dependency>有关 Red Hat Business 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>如果您在用于调试日志的客户端应用程序
pom.xml文件中添加slf4j依赖项,请在相关 classpath 上创建一个简单的logger.properties文件(例如,在 Maven 中的src/main/resources/META-INF中),其中包含以下内容:org.slf4j.simpleLogger.defaultLogLevel=debug在客户端应用程序中,创建一个包含必要的导入和
main ()方法的.java主类,来加载 KIE 基础、插入事实和执行规则。例如,项目中的
Person对象包含 getter 和 setter 方法,用于设置和检索名字、姓氏、每小时率以及个人的 wage。项目中的以下Wage规则计算 wage 和每小时速率值,并根据结果显示一条消息: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- 在命令行和服务器日志中查看规则执行状态。如果有任何规则没有如预期执行,请查看项目中配置的规则和主类配置以验证所提供的数据。