Drools规则引擎讲解
文章目录
- 学前
- 规则引擎
- 作用
- 优势
- Drools
- 项目搭建流程
- 项目结构
- pom.xml
- 配置文件
- 规则文件
- 语法说明
- 规则说明
- 规则执行代码
- 规则调用接口
学前
有这样一串代码,代表着积分策略业务,计算额外积分金额:
- 100 以下, 不加分;
- 100-500 加100分;
- 500-1000 加500分;
- 1000 以上 加1000分;
public class JavaScoreExample {public static void main(String[] args) throws Exception { List<Order> orderList = getInitData();for (int i=0; i<orderList.size(); i++){ Order order = orderList.get(i); if (order.getAmout() <= 100){ order.setScore(0); addScore(order); }else if(order.getAmout() > 100 && order.getAmout() <= 500){ order.setScore(100); addScore(order); }else if(order.getAmout() > 500 && order.getAmout() <= 1000){ order.setScore(500); addScore(order); }else{ order.setScore(1000); addScore(order); } } } private static void addScore(Order o){ System.out.println("用户" + o.getUser().getName() + "享受额外增加积分: " + o.getScore()); } private static List<Order> getInitData() throws Exception { List<Order> orderList = new ArrayList<Order>();DateFormat df = new SimpleDateFormat("yyyy-MM-dd");{Order order = new Order(); order.setAmout(80); order.setBookingDate(df.parse("2015-07-01")); User user = new User();user.setLevel(1); user.setName("Name1"); order.setUser(user); orderList.add(order); }{Order order = new Order(); order.setAmout(200); order.setBookingDate(df.parse("2015-07-02")); User user = new User();user.setLevel(2); user.setName("Name2"); order.setUser(user); orderList.add(order); } return orderList; }
}
综上,如果这时由于市场需求变化,又要调整规则时候,则又要进行业务层面的代码修改、部署,十分麻烦。
那该怎么办呢?
规则引擎
作用
我们可以把决策规则从应用程序中分离出来,将对系统提供很大的便利
优势
- 简化系统架构,优化应用
- 提高系统的可维护性和维护成本
- 减少编写“硬代码”业务规则的成本和风险
Drools
Drools是一个基于java的规则引擎,它是开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。具有易于访问企业策略、易于调整以及易于管理的特点,作为开源业务规则引擎,符合业内标准,速度快、效率高。
项目搭建流程
以下项目基于Springboot搭建
项目结构
项目存放:image/drool.rar
pom.xml
<!--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>
配置文件
@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();}
}
规则文件
语法说明
- 文件格式:可以 .drl、xml文件,也可以Java代码块硬编码
- package:规则文件中,package是必须定义的,必须放在规则文件第一行
- import:规则文件使用到的外部变量,可以是一个类,也可以是类中的可访问的静态方法
- rule:定义一个规则。paramcheck1规则名。规则通常包含三个部分:属性、条件、结果
规则说明
- salience 的值越大,越优先执行
- 规则流程:如果paramId不为null,参数标识是+号,执行添加规则,-号,执行移除规则操作
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
规则执行代码
@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()) ;}}
}
规则调用接口
@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() ;}
}
由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!
Drools规则引擎讲解相关推荐
- drools规则引擎的基本使用和原理介绍
理论基石 借用:<drools规则引擎技术指南>来说, drools是: 开源项目,规则引擎技术,规则语法形成的规则文件,可以存在数据库等,通过drools包提供的接口,调用生成对应的结果 ...
- 详解:Drools规则引擎探究
引入 ▐ 问题引入 天猫奢品业务方为了吸引更多的新客,和提高会员的活跃度,做了一期活动,通过购买天猫奢品频道内的任意商品就赠送特殊积分,积分可以直接兑换限量的奢品商品.假如业务方给的规则如下: 主刃同 ...
- 使用 Drools 规则引擎实现业务逻辑,可调试drl文件
http://www.srcsky.com/tech/arts/389.html 代码下载http://download.csdn.net/detail/zhy011525/2462313 使用 Dr ...
- drools规则引擎因为内存泄露导致的内存溢出
进入这个问题之前,先了解一下drools: 在很多行业应用中比如银行.保险领域,业务规则往往非常复杂,并且规则处于不断更新变化中,而现有很多系统做法基本上都是将业务规则绑定在程序代码中. 主要存在的问 ...
- SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...
- SpringBoot整合Drools规则引擎动态生成业务规则
最近的项目中,使用的是flowable工作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页面去动态配置改变,所以就花了几天时间去研究 ...
- drools规则引擎 java_Drools规则引擎的使用总结
前一段时间在开发了一个做文本分析的项目.在项目技术选型的过程中,尝试使用了Drools规则引擎.让它来作为项目中有关模式分析和关键词匹配的任务.但后来,因为某种原因,还是撇开了Drools.现将这个过 ...
- 大数据风控项目实战 Drools规则引擎
可以借鉴的干货 1,统一存储服务,包含:多种存储库连接封装和服务封装 在统一存储服务 2.获取配置的环境 类:EnvVariable 一.风控项目介绍 对一个复杂支付系统提供统一.全面.高效的风险控制 ...
- drools规则引擎动态配置规则
先说下我的业务需求背景,最近公司要推出运营活动,根据用户行为送用户积分:比如用户注册送.首次消费送,非首次消费送.累积消费送.针对我们这个的特殊要求是跟具体规则绑定:比如说 规则1 用户累积消费首次达 ...
- Drools规则引擎-memberOf操作
场景 规则引擎技术讨论2群(715840230)有同学提出疑问,memberOf的使用过程中如果,memberOf之后的参数不是集合也不是数组,而是格式如"1,2,3,4"的字符串 ...
最新文章
- windows7、windows 2008和windows 2008 R2 的系统封装介绍
- 关于线程池ExecutorService的shutdown()与shutdownNow()方法的区别
- python处理excel字典-python从excel创建字典
- Linux上搭建nginx,及简单配置
- 提高 Web 站点性能的最佳实践
- celery mysql 异步_celery配合rabbitmq任务队列实现任务的异步调度执行[celery redis]
- 数列分块入门 4(LibreOj-6280)
- 如何搭建一个uni-app项目并运行
- Windows系统常用网络命令详解及命令示例(全)
- C盘爆满原来是腾讯电脑管家惹的祸
- Android文字转语音播报
- 【酷毙了】野火新版fireTools多功能调试助手,有Windows和Linux版本,就问你喜不喜欢。...
- 信息系统安全等级保护(简称“等保”)
- iPhone的九宫格实现代码
- 啪嗒砰2 刷材料 附如何刷高级素材+BOSS弱点
- Windows10记一次去掉桌面图标箭头引发的血案:该文件没有与之关联的应用来执行操作,请安装一个程序,若已安装程序,请在默认程序控制面板中创建关联。
- H3C防火墙升级系统版本报错:No sufficient storage space on the device
- 邪恶心理学-真实面对谎言的本质
- 发送邮件报错:452 Too many recipients
- 算法006:二分查找 递归、非递归