19.3. loan 应用程序项目示例
在以下小节中,loan 应用程序项目用作将 DRL 项目迁移到红帽构建的 Kogito 部署的示例。loan 应用程序项目的域模型由两个类组成,即 LoanApplication 类和 Applicant 类:
LoanApplication 类示例
Applicant 类示例
规则集使用商业决策批准或拒绝应用程序,以及收集列表中所有批准应用程序的最后一个规则。
在 loan 应用程序中设置的规则示例
19.3.1. 使用红帽构建的 Quarkus 来通过 REST 端点公开规则评估 复制链接链接已复制到粘贴板!
您可以使用 Red Hat build of Quarkus 来公开在 Business Central 中开发的规则评估。
流程
根据包含规则和 Quarkus 库的模块创建新模块,提供 REST 支持:
创建新模块的依赖项示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 REST 端点。
以下是创建 REST 端点的示例设置:
FindApprovedLoansEndpoint端点设置示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,创建包含规则的
KieContainer,并将其添加到静态字段中。KieContainer中的规则是从类路径中的其他模块中获取的。使用这个方法,您可以重复使用相同的KieContainer,以便后续与FindApprovedLoansEndpoint端点相关的后续调用,而无需重新编译规则。注意这两个模块会整合到使用旧 API 将规则单元迁移到红帽构建的 Kogito 微服务中。如需更多信息,请参阅 使用旧 API 将 DRL 规则单元迁移到红帽构建的 Kogito 微服务。
调用
FindApprovedLoansEndpoint端点时,会从KieContainer创建新的KieSession。KieSession使用LoanAppDto中的对象填充 JSON 请求的 unmarshalling。LoanAppDto类示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 调用
fireAllRules ()方法时,将触发KieSession,并根据输入数据评估业务逻辑。评估业务逻辑后,最后的规则会收集列表中的所有批准应用程序,并将返回相同的列表作为输出。- 启动 Red Hat build of Quarkus 应用程序。
使用包含要检查的 loan 应用的 JSON 请求调用
FindApprovedLoansEndpoint端点。maxAmount的值在规则中使用,如下例所示:curl 请求示例
curl -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"maxAmount":5000, "loanApplications":[ {"id":"ABC10001","amount":2000,"deposit":1000,"applicant":{"age":45,"name":"John"}}, {"id":"ABC10002","amount":5000,"deposit":100,"applicant":{"age":25,"name":"Paul"}}, {"id":"ABC10015","amount":1000,"deposit":100,"applicant":{"age":12,"name":"George"}} ]}' http://localhost:8080/find-approvedcurl -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d '{"maxAmount":5000, "loanApplications":[ {"id":"ABC10001","amount":2000,"deposit":1000,"applicant":{"age":45,"name":"John"}}, {"id":"ABC10002","amount":5000,"deposit":100,"applicant":{"age":25,"name":"Paul"}}, {"id":"ABC10015","amount":1000,"deposit":100,"applicant":{"age":12,"name":"George"}} ]}' http://localhost:8080/find-approvedCopy to Clipboard Copied! Toggle word wrap Toggle overflow JSON 响应示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用这个方法,您无法使用热重新加载功能,且无法创建项目的原生镜像。在后续步骤中,缺少的 Quarkus 功能由 Kogito 扩展提供,它允许 Quarkus 了解 DRL 文件,并以类似的方式实施热重新加载功能。
19.3.2. 使用旧 API 将规则评估迁移到红帽构建的 Kogito 微服务 复制链接链接已复制到粘贴板!
使用 REST 端点公开规则评估后,您可以使用旧 API 将规则评估迁移到红帽构建的 Kogito 微服务。
流程
在项目
pom.xml文件中添加以下依赖项,以启用 Red Hat build of Quarkus 和 legacy API:使用 Quarkus 和旧 API 的依赖项示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重写 REST 端点实现:
REST 端点实现示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在重写的 REST 端点实现中,而不是从
KieContainer创建KieSession,而是使用集成的KieRuntimeBuilder自动创建KieSession。KieRuntimeBuilder是kogito-legacy-api模块提供的接口,它取代了KieContainer。使用KieRuntimeBuilder,您可以使用KieContainer创建KieBases和KieSessions。红帽构建的 Kogito 在编译时自动生成KieRuntimeBuilder接口的实现,并将KieRuntimeBuilder集成到类中,它实施FindApprovedLoansEndpointREST 端点。以开发模式启动您的红帽 Quarkus 应用程序构建。
您还可以使用热重新加载来更改应用到正在运行的应用程序的规则文件。另外,您可以创建基于规则应用程序的原生镜像。
19.3.3. 实施规则单元和自动 REST 端点生成 复制链接链接已复制到粘贴板!
将规则单元迁移到红帽构建的 Kogito 微服务后,您可以实施规则单元和自动生成 REST 端点。
在红帽构建的 Kogito 中,规则单元包含一组规则和事实,规则匹配规则。红帽构建的 Kogito 中的规则单元也附带数据源。规则单元数据源是由给定规则单元处理的数据来源,代表用于评估规则单元的入口点。规则单元使用两种类型的数据源:
-
Datastream :这是仅附加的数据源。在DataStream中,订阅者接收新的和过去的信息,流可以在重新主动流中热或冷使用。另外,添加到DataStream中的事实无法更新或删除。 -
Datastore:此数据源用于可修改的数据。您可以使用当对象添加到DataStore时返回的factHandle更新或删除对象。
总体而言,规则单元包含两个部分:要评估的事实的定义以及评估事实的规则集合。
流程
使用 POJO 实现事实定义:
使用 POJO 进行事实定义的实现示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在上例中,而不是使用
LoanAppDtoLoanUnit类被直接绑定。LoanAppDto用于 marshall 或 unmarshall JSON 请求。另外,上例实现了org.kie.kogito.rules.RuleUnitData接口,并使用DataStore来包含要批准的 loan 应用程序。org.kie.kogito.rules.RuleUnitData是一个标记接口,用于通知LoanUnit类是规则单元定义的一部分。此外,DataStore负责允许多集群引擎通过触发新规则并触发其他规则来响应更改。另外,规则的结果会修改上例中的
批准属性。在 contrary 上,maxAmount值被视为规则单元的配置参数,没有修改。maxAmount在规则评估过程中自动处理,并从 JSON 请求传递的值自动设置。实现 DRL 文件:
DRL 文件的实现示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您创建的 DRL 文件必须声明与事实定义的实现和具有相同 Java 类的单元相同的软件包。Java 类实施
RuleUnitData接口,以说明接口属于同一规则单元。另外,上例中的 DRL 文件使用 OOPath 表达式重写。在 DRL 文件中,数据源充当入口点,OOPath 表达式包含数据源名称作为 root。但是,限制添加到方括号中,如下所示:
$L: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount IANA maxAmount ]或者,您可以使用标准 DRL 语法,您可以在其中将数据源名称指定为入口点。但是,您需要再次指定匹配对象的类型,如下例所示,即使决定引擎可以从数据源中推断类型:
$L: LoanApplication (applicant.age >= 20, deposit >= 1000, amount ö maxAmount) from entry-point loanApplications在上例中,收集所有批准的 loan 应用程序的最后一个规则将被检索列表的查询替代。规则单元定义了要在输入中传递的事实,查询则定义规则评估的预期输出。使用这个方法,红帽构建的 Kogito 可以自动生成执行查询的类并返回输出,如下例所示:
LoanUnitQueryFindApproved类示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下是 REST 端点的示例,它使用规则单元作为输入,并将输入传递给查询执行器返回输出:
LoanUnitQueryFindApprovedEndpoint端点示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您还可以添加多个查询,每个查询都会生成不同的 REST 端点。例如,为 find-approved 生成
FindApprovedREST 端点。