Drools
规则引擎
规则引擎:全称为业务规则管理系统,英文名:BRMS(Business Rule Management System)
规则引擎主要思想:将应用程序中的业务决策部分呢分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务关系管理系统。
规则引擎实现了:将业务决策从业务代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做业务决策。规则引擎其实就是一个输入输出平台。
规则引擎主要场景
对于一些比较复杂的业务规则并且业务规则会频繁变动的系统比较适合使用规则引擎,比如:
- 风险控制系统----风险贷款,风险评估
- 反欺诈项目----银行贷款,征信验证
- 决策平台系统----财务计算
- 促销平台系统----满减,打折,加购价
Drools介绍
Drools是一款由JBoss组织提供的基于JAVA语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存到数据库中),使得业务规则的变更不需要修改项目代码,不需要重启服务器就可以在线上环境立即生效。
Drools官网:https://drools.org
Drools源码:https://github.com/kiegroup/drools
规则引擎构成
- Working Memory(工作内存)
- Rule Base(规则库)
- Inference Engine(推理引擎)
其中Inference Engine(推理引擎)又包含
- Pattern Macher(匹配器),具体匹配哪一个规则由这个完成
- Agenda(议程)
- Execution Engine(执行引擎)
Drools API开发步骤
- 获取KieServices
- 获取KieContainer
- KieSession
- Insert fact
- 触发规则
- 关闭KieSession
pom.xml添加drools引用
org.drools drools-compiler 7.10.0.Final junit junit 4.12
在main/resources文件下新增META-INF文件夹,并在META-INF下添加kmodule.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>"http://www.drools.org/xsd/kmodule"> "myKbase1" packages="rules" default="true"> "kession-rule" default="true">
在main/resources文件下新增rules文件夹,并在rules下添加.drl规则文件
调用规则
@Test public void test_drools(){ //第一步:获取服务 KieServices kieServices = KieServices.Factory.get(); //第二步:获取容器 KieContainer kieContainer =kieServices.getKieClasspathContainer(); //第三步:通过容器获取KieSession,由KieSession和规则引擎打交道 KieSession kieSession = kieContainer.newKieSession(); //事实对象 Order order =new Order(); order.setAmount(700); //第四步:插入事实对象到规则内存中,规则引擎根据数据进行规则匹配 kieSession.insert(order); //第五步:执行规则引擎 kieSession.fireAllRules(); //第六步:关闭KieSession会话 kieSession.dispose(); System.out.println(order.getScore()); }
Drools基础语法
规则文件的构成
drl:是Drools Rule Language缩写
- package:包名。package对应的不一定是真正的目录。同一个包下的drl文件可以互相访问
- import:用于导入类或静态方法
- global:全局变量
- function:自定义函数
- query:查询
- rule end:规则体
规则体语法结构
规则条件部分
在LHS中,可包含0~n个条件,多个pattern之间可采用“&&” “||” “,”来实现,不写默认为&&
比较操作符:>=, >, ==, <, <=, !=, contains(对象是否包含在集合中), not contains, memberof(对象的某个属性是否在一个或多个集合中), not memberof, matches(正则表达式), not matches
结果部分
insert/insertLogical, update, retract
ps:一旦调用insert/update/retract宏函数,那么Drools会重新与所有的规则再重新匹配一次, 对于没有设置no-loop属性为true的规则,如果条件满足,不管之前是否执行过都会再执行一次
属性Attribute