SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
本文源码:GitHub·点这里 || GitEE·点这里
一、Drools引擎简介
1、基础简介
Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。具有易于访问企业策略、易于调整以及易于管理的特点,作为开源业务规则引擎,符合业内标准,速度快、效率高。
2、规则语法
(1)、演示drl文件格式
package droolRule ;
import org.slf4j.Logger
import org.slf4j.LoggerFactory ;
dialect "java"
rule "paramcheck1"when thenfinal Logger LOGGER = LoggerFactory.getLogger("param-check-one 规则引擎") ;LOGGER.info("参数");
end
(2)、语法说明
· 文件格式
可以 .drl、xml文件,也可以Java代码块硬编码;
· package
规则文件中,package是必须定义的,必须放在规则文件第一行;
· import
规则文件使用到的外部变量,可以是一个类,也可以是类中的可访问的静态方法;
· rule
定义一个规则。paramcheck1规则名。规则通常包含三个部分:属性、条件、结果;
二、整合SpringBoot框架
1、项目结构
2、核心依赖
<!--drools规则引擎-->
<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.6.0.Final</version>
</dependency>
<dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.6.0.Final</version>
</dependency>
<dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>7.6.0.Final</version>
</dependency>
<dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>7.6.0.Final</version>
</dependency>
<dependency><groupId>org.kie</groupId><artifactId>kie-spring</artifactId><version>7.6.0.Final</version>
</dependency>
3、配置文件
@Configuration
public class RuleEngineConfig {private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineConfig.class) ;private static final String RULES_PATH = "droolRule/";private final KieServices kieServices = KieServices.Factory.get();@Beanpublic KieFileSystem kieFileSystem() throws IOException {KieFileSystem kieFileSystem = kieServices.newKieFileSystem();ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();Resource[] files = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "*.*");String path = null;for (Resource file : files) {path = RULES_PATH + file.getFilename();LOGGER.info("path="+path);kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));}return kieFileSystem;}@Beanpublic KieContainer kieContainer() throws IOException {KieRepository kieRepository = kieServices.getRepository();kieRepository.addKieModule(kieRepository::getDefaultReleaseId);KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());kieBuilder.buildAll();return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());}@Beanpublic KieBase kieBase() throws IOException {return kieContainer().getKieBase();}@Beanpublic KieSession kieSession() throws IOException {return kieContainer().newKieSession();}@Beanpublic KModuleBeanFactoryPostProcessor kiePostProcessor() {return new KModuleBeanFactoryPostProcessor();}
}
这样环境整合就完成了。
三、演示案例
1、规则文件
- 规则一
dialect "java"
rule "paramcheck1"salience 99when queryParam : QueryParam(paramId != null && paramSign.equals("+"))resultParam : RuleResult()thenfinal Logger LOGGER = LoggerFactory.getLogger("param-check-one 规则引擎") ;LOGGER.info("参数:getParamId="+queryParam.getParamId()+";getParamSign="+queryParam.getParamSign());RuleEngineServiceImpl ruleEngineService = new RuleEngineServiceImpl() ;ruleEngineService.executeAddRule(queryParam);resultParam.setPostCodeResult(true);
end
- 规则二
dialect "java"
rule "paramcheck2"salience 88when queryParam : QueryParam(paramId != null && paramSign.equals("-"))resultParam : RuleResult()thenfinal Logger LOGGER = LoggerFactory.getLogger("param-check-two 规则引擎") ;LOGGER.info("参数:getParamId="+queryParam.getParamId()+";getParamSign="+queryParam.getParamSign());RuleEngineServiceImpl ruleEngineService = new RuleEngineServiceImpl() ;ruleEngineService.executeRemoveRule(queryParam);resultParam.setPostCodeResult(true);
end
规则说明:
A、salience 的值越大,越优先执行;
B、规则流程:如果paramId不为null,参数标识是+号,执行添加规则,-号,执行移除规则操作。
2、规则执行代码
@Service
public class RuleEngineServiceImpl implements RuleEngineService {private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineServiceImpl.class) ;@Overridepublic void executeAddRule(QueryParam param) {LOGGER.info("参数数据:"+param.getParamId()+";"+param.getParamSign());ParamInfo paramInfo = new ParamInfo() ;paramInfo.setId(param.getParamId());paramInfo.setParamSign(param.getParamSign());paramInfo.setCreateTime(new Date());paramInfo.setUpdateTime(new Date());ParamInfoService paramInfoService = (ParamInfoService)SpringContextUtil.getBean("paramInfoService") ;paramInfoService.insertParam(paramInfo);}@Overridepublic void executeRemoveRule(QueryParam param) {LOGGER.info("参数数据:"+param.getParamId()+";"+param.getParamSign());ParamInfoService paramInfoService = (ParamInfoService)SpringContextUtil.getBean("paramInfoService") ;ParamInfo paramInfo = paramInfoService.selectById(param.getParamId());if (paramInfo != null){paramInfoService.removeById(param.getParamId()) ;}}
}
3、规则调用接口
@RestController
@RequestMapping("/rule")
public class RuleController {@Resourceprivate KieSession kieSession;@Resourceprivate RuleEngineService ruleEngineService ;@RequestMapping("/param")public void param (){QueryParam queryParam1 = new QueryParam() ;queryParam1.setParamId("1");queryParam1.setParamSign("+");QueryParam queryParam2 = new QueryParam() ;queryParam2.setParamId("2");queryParam2.setParamSign("-");// 入参kieSession.insert(queryParam1) ;kieSession.insert(queryParam2) ;kieSession.insert(this.ruleEngineService) ;// 返参RuleResult resultParam = new RuleResult() ;kieSession.insert(resultParam) ;kieSession.fireAllRules() ;}
}
这样,完整的案例就结束了。
四、源代码地址
GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent
SpringBoot2 整合 Drools规则引擎,实现高效的业务规则相关推荐
- 量身定制规则引擎,适应多变业务场景
为什么80%的码农都做不了架构师?>>> 规则引擎适合于做业务规则频繁变化的场景,我们的业务在应用过程中,也经常要处理大量的业务规则,当然,也希望能有一套规则引擎来支撑,这样是 ...
- drools规则引擎技术指南_物联网规则引擎技术
物联网应用程序设计与典型的IT解决方案大不相同,因为它将物理操作技术(OT)与传感器.致动器和通信设备连接起来,并将数字信息技术(IT)与数据.分析和工作流连接起来. 在企业环境中,物联网非常复杂,这 ...
- 规则引擎 drools_为什么要用规则引擎?
作者:孤独烟来源:https://www.cnblogs.com/rjzheng/p/10996186.html 一天,朱斯参加了一场code Review研讨会.会上的一群人正在讨论着如何对祖传代码 ...
- 规则引擎 drools_网易考拉规则引擎平台架构设计与实践
背景 考拉安全部技术这块目前主要负责两块业务:一个是内审,主要是通过敏感日志管理平台搜集考拉所有后台系统的操作日志,数据导入到es后,结合storm进行实时计算,主要有行为查询.数据监控.事件追溯.风 ...
- mysql 规则引擎_为什么要用规则引擎?
一天,朱斯参加了一场code Review研讨会.会上的一群人正在讨论着如何对祖传代码进行变更,大家你一言,我一语,场面十分热闹! 突然,只见人群中的一个人满面愁容,说道:"昨天在项目中看到 ...
- java 规则引擎_GitHub - javaso/rulegin: 分布式规则引擎系统,重构于开源IOT项目thingboard...
一.背景 规则引擎是一种根据规则中包含的指定条件,判断其能否匹配运行时刻的实时条件来执行规则中所规定的动作, 用户可通过规则引擎设定消息处理规则, 对指定的消息采取相应的措施来对设备进行监控和处理,如 ...
- Thingsboard规则引擎详解,TB规则引擎如何使用
一.规则引擎是什么? 官方解释:"规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业 ...
- springboot2整合drools规则引擎(kie-spring+drools-core)
What&Why Drools? Drools(JBoss Rules )的前身是Codehaus的一个开源项目叫Drools,后来纳入JBoss门下,更名为JBoss Rules,成为了JB ...
- python3 规则引擎_几个常见规则引擎的简单介绍和演示
Ilog JRules 是最有名的商用BRMS: Drools 是最活跃的开源规则引擎: Jess 是Clips的java实现,就如JRuby之于Ruby,是AI系的代表: Visual Rules( ...
最新文章
- 最近和Nginx杠上了!
- 关于学习过程中走过的弯路
- 模拟电路技术之基础知识(四)
- PHP电商的sku,tech| 关于电商系统中sku与spu的一个难题
- 小白webpack进行nodejs 前端打包配置
- qt 实现自己的小笔记本(哼。拿下本本记下来了
- enum 使用规范及技巧(C# 参考)
- 接口测试--获取动态参数进阶
- thinkphp自动验证分析
- python爬取网页内容requests_[转][实战演练]python3使用requests模块爬取页面内容
- python画图案 使用循环完成_利用python在终端模拟下雪的效果
- Hyperf JSON RPC 服务 Demo
- 萤石云 UIKit Javascript 使用
- html常用js统计图表插件
- pyimagesearch-5 霍比特人和直方图 - 使用Python构建您的第一个图像搜索引擎的操作指南
- 微信公众号自定义服务器,微信公众号自定义服务器的第一次验证
- C# 地理信息系统GIS开源软件
- 表白,游戏,跨年,各种节日祝福的link
- Vue绘制折线图并渲染数据
- git如何安装aur_Linux┊一个好用的AUR工具yaourt | 简单.生活
热门文章
- 操作系统之计算机系统概述:1、操作系统概述(定义、功能、作用)
- (王道408考研操作系统)第一章计算机系统概述-第一节4:中断和异常
- (计算机组成原理)第一章计算机系统概述-第一节:计算机发展历程
- 2-2:C++快速入门之输入和输出
- linux 可执行文件去除绝对路径
- 双向循环链表:维吉尼亚密码
- 工具资源系列之 github 上各式各样的小徽章从何而来?
- C#不支持XPATH2.0
- Linux实战教学笔记13:定时任务补充
- Oracle数据库导入导出 imp/exp备份还原