业务开发过程中,对于某些判断性的通用规则是基于if-else封装,还是基于策略模式封装?无论以上那种封装出来的方法,只能在单体软件包中共用,且不能无感部署,然而对于业务而言,可能规则改变的比较频繁,例如与营销有关的活动,会频繁的修改商品价格的判断,不断的修改规则,在业务划分上,这类的业务功能被称为风险控制,因此学习规则文件以及加载执行规则文件的规则引擎则是我自己对于风险控制领域业务领域理解的必要前提。
- package 逻辑包名
- dialect 方言名称
- import 导入的需要进入规则的对象类型(如需规则使用则要预先将其存入引擎内存)
-
- function 函数名称(args){脚本语句...}
-
- query 查询名称(与规则名称一致需要为双引号包裹)(args){
- $result: 规则Pattern
- end
- }
-
- rule “规则名称”
- attributes (属性说明,例如no-loop防止死循环)
- when
- LHS
- then
- RHS
- end
LHS部分为空语句时,自动翻译成eval(true)直接通过条件判断进入RHS执行流程。值得一提的是eval()语句内部支持任何可以执行的语句,只要它执行的结果会返回一个布尔类型的值。
LHS部分为类似$user:User(age >= 18)语句时,其意为拿到引擎内部的Working memory 中类型为导入的User的相应Fact对象并匹配age大于等于18的对象,如果存在则返回true反之返回false,同时支持多个类似的属性匹配语句:例如$user:User( age >= 18 and name = ‘name’)
LHS满足的条件限制语句包含:and、or、||、&&以及not、in、exists、forall、from、collect、accumulate等。
通常来看RHS是通过条件判断时,需要执行的逻辑代码,不应该存在判断逻辑。
推荐JAVA业务逻辑触发方式:
规则引擎提供的快速访问修改working memory内存对象中的方法有:新增insert、修改update、删除retract。其次提供外宏对象drools调用更多API,kcontext宏对象直接访问运行时working memory内部的fact对象。
需要注意的是drools自带的function函数类似于JavaScript中的函数,但是在规则引擎中,一般的function函数需要返回一个布尔类型或者带返回类型,规范用法则是在LHS中使用eval(function(args))进行使用。
这里的查询代码相当于LHS部分,只是它需要以end结束,告知引擎本次查询结束,可以接收返回值,根据返回值决定后续流程。
- query ”query_user_name“(arg){
- $user: User(name = arg)
- end
- }
注:global关键字与Java中的final static基本一致,在同一个session中可以全局共享使用。
位置在举例代码中的attributes即是Drools规则的属性
常见的属性配置有:Salience优先级(规则的优先级越高越先执行,默认为0)、no-loop(防止规则的死循环执行,值为false时可能会由规则引擎循环执行)、date-effective(日期计划,当日期到达后面的值时才会执行规则)、date-expires(日期比较,当日期超过后面的日期时才会执行)、Dialect(定义规则中的方言类型,一般分为eval与java)、Enable(规则是否启用)、lock-on-active(规则限制只运行一次)、activation-group(规则分组)。
- @Configuration
- @ImportResource("classpath:spring-drools.xml")
- public class DroolsBeansConfig {
-
- }
主体思路:将规则条件封入字典表或枚举中,所有的规则导入规则表中,实例化配置javaBean,专门执行规则的加载与执行。
待更新......
Maven依赖:
- <dependency>
- <groupId>org.kiegroupId>
- <artifactId>kie-springartifactId>
- <version>7.55.0.Finalversion>
- dependency>