【Drools】(三)基于业务数据动态调用 DRL 规则文件:详细实现与测试指南

基于业务数据动态调用 DRL 规则文件:详解与实战

在业务规则管理中,DRL 文件(Drools Rule Language 文件)用于定义和执行业务规则。通过动态调用 DRL 文件,我们可以根据不同的业务场景灵活配置和执行定制化的规则,从而提高业务规则配置的灵活性和效率。本文将详细介绍如何基于业务数据动态调用 DRL 规则文件,并提供详细的代码注释和实现步骤,以帮助理解其执行过程。我们还将展示一个测试功能,用于模拟真实场景并验证规则执行的成功与否。

drools介绍,请参考: 探索Drools:Java世界的规则引擎

1. DRT 文件介绍

DRL(Drools Rule Language)文件是用来编写规则的文件格式,基于 DRT 规则模板动态配置生成 DRL 规则文件(更多请看:(一)基于业务需求动态生成 DRT 规则模板:事实与动作定义详解),我们可以根据不同的业务场景创建定制化的规则,提高业务规则配置的灵活性和效率。

下面是: (二)基于业务需求动态生成 DRL 规则文件:事实与动作定义详解

package org.droolsimport com.xinyuan.re.utils.DateUtilsdeclare SuppliersNumberFactPVOpurchaseMethod: StringprojectStage: StringsuppliersNumber: Integer
enddeclare SubmitTaskVerifyMessagestate: inttext: String
endrule "re_openbid_supplier_count_0"when $suppliers_number_fact_p_v_o : SuppliersNumberFactPVO(("00380002,00380024,00380020,00380003" == "null" || purchaseMethod memberOf "00380002,00380024,00380020,00380003") &&("1" == "null" || projectStage == 1) &&("3" == "null" || suppliersNumber < 3));$submit_task_verify_message : SubmitTaskVerifyMessage();then $submit_task_verify_message.setState(2);$submit_task_verify_message.setText("招标的项目,投标人数量少于3个不得开标");
endrule "re_openbid_supplier_count_1"when $suppliers_number_fact_p_v_o : SuppliersNumberFactPVO(("00380002,00380003,00380020,00380024" == "null" || purchaseMethod memberOf "00380002,00380003,00380020,00380024") &&("2" == "null" || projectStage == 2) &&("3" == "null" || suppliersNumber < 3));$submit_task_verify_message : SubmitTaskVerifyMessage();then $submit_task_verify_message.setState(2);$submit_task_verify_message.setText("资审阶段的项目,申请人数量少于3个不得开启");
end
2. 规则测试功能

我们为此专门开发了一个测试功能,可以模拟真实的业务场景,并调用规则执行,返回规则执行结果。通过此功能,可以快速验证规则的正确性和业务适用性。

测试功能界面如图所示:
在这里插入图片描述

在测试功能中,事实定义的数据会自动加载出来,用户可以根据实际需求输入相关参数,点击测试按钮后系统会自动调用规则引擎,返回测试结果。

3. 代码实现详解

下面是完整的代码实现,并附上详细注释,帮助理解其生成过程:

/*** 执行规则** @param ruleEngineContext 规则引擎上下文* @return 执行结果*/
@Override
public ReturnValue<Map<String, Object>> execRule(RuleEngineContext ruleEngineContext) {log.info("---------------执行规则开始---------------");// 获取规则定义GetReDefine getReDefine = reEngineService.getReDefine(ruleEngineContext.getRuleCode());Map<String, Object> actionMap = new HashMap<>();// 检查规则文件是否存在if (StringUtils.isNotBlank(getReDefine.getDrl_rule_file())) {// 获取事实定义GetReFactDefine getReFactDefine = reEngineService.getReFactDefine(getReDefine.getId());// 获取动作定义GetReActionDefine getReActionDefine = reEngineService.getReActionDefine(getReDefine.getId());// 使用 KieHelper 构建规则引擎KieHelper helper = new KieHelper();GetBigColumnRVO getBigColumnRVO = bigColumnFacade.getBigColumn(getReDefine.getDrl_rule_file());helper.addContent(getBigColumnRVO.getZdz(), ResourceType.DRL);log.info("执行规则,drl文件:{}", getBigColumnRVO.getZdz());// 构建 KieBaseKieBase kieBase = helper.build();// 获取事实类型和动作类型FactType factType = kieBase.getFactType(Constants_public.ORG_DRT_PACKAGE_NAME, getReFactDefine.getClass_name());FactType actionType = kieBase.getFactType(Constants_public.ORG_DRT_PACKAGE_NAME, getReActionDefine.getClass_name());log.info("执行规则,事实定义,所属服务:{}", getReFactDefine.getOwn_service());Map<String, Object> bizData;// 如果业务数据为空,则根据业务编号获取业务数据if (ruleEngineContext.getBizData().isEmpty()) {ReturnValue<Map<String, Object>> returnValue = reBizFacade.getBizData(getReFactDefine.getOwn_service(),RuleEngineContext.builder().bizId(ruleEngineContext.getBizId()).implClass(getReFactDefine.getFact_loader()).build());bizData = returnValue.getData();} else {// 使用上下文中的业务数据bizData = ruleEngineContext.getBizData();// 将数值类型的字符串转换为相应的数值类型List<ConditionDefine> conditionDefineList = getReFactDefine.getConditionDefineList();Map<String, Integer> conditionMap = conditionDefineList.stream().collect(Collectors.toMap(ConditionDefine::getFieldCode, ConditionDefine::getFieldType));bizData.forEach((key, val) -> {if (val != null && Objects.equals(conditionMap.get(key), Constants_re.FACT_PROP_TYPE_NUMBER)) {if (ConvertUtil.createString(val).length() >= 8) {bizData.put(key, ConvertUtil.createLong(val));} else {bizData.put(key, ConvertUtil.createInteger(val));}}});}log.info("执行规则,业务数据:{}", bizData);Object factInstance;Object actionInstance;try {// 创建事实实例factInstance = factType.newInstance();factType.setFromMap(factInstance, bizData);// 创建动作实例actionInstance = actionType.newInstance();} catch (InstantiationException | IllegalAccessException e) {throw new RuntimeException(e);}// 创建 KieSessionKieSession kieSession = kieBase.newKieSession();kieSession.insert(factInstance);kieSession.insert(actionInstance);// 执行所有规则kieSession.fireAllRules();// 释放 KieSessionkieSession.dispose();// 获取动作执行后的结果actionMap = actionType.getAsMap(actionInstance);log.info("执行规则,返回数据:{}", actionMap);}log.info("---------------执行规则结束---------------");ReturnValue<Map<String, Object>> returnValue = ReturnValue.newSuccessInstance();returnValue.setData(actionMap);return returnValue;
}
4. 测试功能说明

为了验证规则文件的正确性,我们实现了一个专门的测试功能。用户可以通过界面输入相关参数,模拟真实业务场景,测试规则的执行情况。

测试功能的使用步骤如下:

  1. 选择步骤:从下拉列表中选择需要测试的业务步骤。
  2. 选择时间类型:从下拉列表中选择时间类型。
  3. 输入当前时间和投标截止时间。
  4. 点击“测试”按钮,系统将调用规则引擎执行规则,并在“测试结果”中显示执行结果。

通过此测试功能,可以快速验证不同业务场景下规则的执行效果,确保规则的正确性和适用性。

总结

本文详细介绍了如何基于业务数据动态调用 DRL 规则文件,并通过实际代码示例和详细注释,阐述了整个执行过程。我们还展示了一个专门的测试功能,帮助模拟和验证规则执行的效果。通过这种方式,可以实现业务规则的灵活配置和高效执行,提升业务系统的自动化和智能化水平。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【中项】系统集成项目管理工程师-第8章 信息安全工程-8.3工程体系架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

MongoDB 基础知识

一、为什么学习MongoDB MongoDB解决Mysql 的“三高”问题&#xff1a; 1.对数据库高并发写入需求 2.对海量数据高效率存储访问需求 3.对数据库高扩展和高可用的需求 MongoDB 实际应用&#xff1a; 1.社交场景&#xff0c;比如朋友圈&#xff0c;附近的人的地点的存储 2.…

Python for循环迭代原理(迭代器 Iterator)

在使用Python时&#xff0c;我们经常会使用for循环来访问容器对象&#xff08;列表、字符、字典等&#xff09;中的元素。其幕后实际是通过迭代协议来完成的&#xff0c;迭代是一种依次访问对象中元素的方式&#xff0c;for循环在对象上调用iter()函数生成一个迭代器&#xff0…

wc -l 统计文件中的行数

wc -l 是一个常用的命令行工具&#xff0c;用于统计文件中的行数。它的使用格式是&#xff1a; wc -l [文件名] 主要用途是计算指定文件中的行数。例如&#xff0c;如果有一个名为 example.txt 的文件&#xff0c;要查看它有多少行&#xff0c;可以运行&#xff1a; wc -l exam…

16 html网页服务和nginx服务

第十六次7.29 1.静态页面 1安装httpd [rootweb ~]# yum -y install httpd 2.真机访问页面 [rootweb html]# echo "静态html文件" > index.html 传入照片再次访问 静态资源&#xff0c;根据开发着保存在项目资源目录中的路径访问静态页面的资源 2.Apache 1.安…

【Docker】Namespace 空间隔离实战

一、实战目的 了解隔离能力并不是 Docker 提供的&#xff0c;而是操作系统内核提供基本能力。 二、基础知识 1、dd 命令详解 Linux dd 命令用于读取、转换并输出数据。 dd 可从标准输入或文件中读取数据&#xff0c;根据指定的格式来转换数据&#xff0c;再输出到文件、…

淘宝商家电话采集 淘宝店铺爬虫软件使用教程

淘宝商家电话采集&#xff1a;淘宝店铺爬虫软件使用教程 淘宝作为中国最大的电子商务平台之一&#xff0c;拥有众多的商家和店铺。有时候我们需要获取特定店铺的联系电话&#xff0c;以便进行合作洽谈或者其他目的。本文将介绍如何使用Python编写一个淘宝店铺爬虫软件来采集商…

有效组织离散变量:指针数组在C语言中的应用

把离散变量组织起来&#xff0c;访问起来更加方便&#xff0c;无需一个个变量单独赋值。 如modbus读写reg&#xff0c; 把a\b\c\d实时变化分散的变量组织成一个数组reg&#xff0c;方便获取 相当于变量的内存地址池 int main() {int a 10, b 20, c 30, d 40;int i;int *re…

Vue3----扩展 element Plug card

扩展 element Plug card 增加全屏&#xff0c;折叠操作项 核心代码 <template><div class"cc-card-component"><el-card v-if"state.isShow" :class"state.class" :bodyStyle"bodyStyle" :shadow"props.shadow…

英语:四、冠词

1、冠词的概述 &#xff08;1&#xff09;冠词的分类 根据冠词的用法&#xff0c;它可以分为定冠词、不定冠词和零冠词。 定冠词 the 不定冠词 a an 零冠词 名词前面没有冠词 &#xff08;2&#xff09;冠词的位置 a、放在名词之前 一般情况下&#xff0c;冠词置于…

Vmwar保姆级安装与配置

文章目录 一、官方下载1.访问VMware官方网站&#xff1a;2.选择产品&#xff1a;3.下载安装包&#xff1a; 二、VMware的安装1.运行安装程序2.选择安装位置3.选择安装选项4.完成安装 三、启动VMware Workstation Pro并配置虚拟机1.创建新的虚拟机&#xff1a;2.配置虚拟机硬件 …

中间件 - 使用Eureka进行微服务注册与发现

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 在微服务架构中…

【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景读取并保存NPOI信息NPOI 插件介绍基本功能示例代码写入 Excel 文件…

前端JavaScript处理小数精度问题(最佳实践)

前言&#xff1a; 针对于小数精度问题&#xff0c;本次我们主要推荐两种方式&#xff0c;一种是简单的函数封装&#xff0c;一种是使用第三方库big.js。 方法一&#xff1a; 自封装函数搭配parseFloat和toFixed解决小数精度问题&#xff0c;仅适用于解决一般性小数精度问题&…

Linux脚本:自动检测的bash脚本,用于检查linux的系统安全性

目录 一、要求 二、脚本介绍 1、脚本内容 2、脚本解释 &#xff08;1&#xff09;函数定义 &#xff08;2&#xff09;防火墙状态检查 &#xff08;3&#xff09;SELinux/AppArmor状态检查 &#xff08;4&#xff09;SSH配置检查 &#xff08;5&#xff09;用户账户数…

android 设备,启用 adb 调试

1 开启开发者选项 如果在android user版本&#xff0c;通过 USB 连接设备上使用 adb&#xff0c;需要在设备启用 USB 调试。通常开发者选项默认&#xff0c;处于隐藏状态。 1.1 开启开发者选项 在设备上&#xff0c;找到build信息选项&#xff0c;列表显示软件版本号&#…

【云原生】Kubernetes----k8s免密使用harbor私有仓库

目录 引言 一、搭建Harbor仓库 &#xff08;一&#xff09;关闭防护 &#xff08;二&#xff09;安装docker &#xff08;三&#xff09;安装docker-compose &#xff08;四&#xff09;安装harbor-offline 1.获取安装包 2.修改配置文件 3.启动服务 4.登录仓库验证 二…

营销人看巴黎奥运会,看到了什么?

不同的人眼中的巴黎奥运会是不一样的&#xff1a;环保人士关注奥运场馆的绿色设计&#xff0c;以及赛事期间对可再生能源的利用&#xff1b;旅游博主用镜头捕捉巴黎奥运会每一个精彩瞬间&#xff1b;社会学家在巴黎奥运会看到多元文化的交流与融合…… 那么营销人在巴黎奥运会…

聚观早报 | OPPO Find X8系列电池曝光;小米15 Pro更多影像细节

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 7月30日消息 OPPO Find X8系列电池曝光 小米15 Pro更多影像细节 KeeTa平台已开放便利店入驻 比亚迪方程豹将扩大…

大模型面试之LoRA

LoRA的解释&#xff1a;一种高效微调预训练神经网络的方法 LoRA 解决的问题&#xff1a; &#x1f538; 2021年初&#xff0c;微软与OpenAI合作探索GPT-3的商业可行性。 &#x1f538; 发现仅仅通过提示&#xff08;prompting&#xff09;不足以完成生产任务&#xff0c;例如…