Drools规则引擎入门学习记录

业务开发过程中,对于某些判断性的通用规则是基于if-else封装,还是基于策略模式封装?无论以上那种封装出来的方法,只能在单体软件包中共用,且不能无感部署,然而对于业务而言,可能规则改变的比较频繁,例如与营销有关的活动,会频繁的修改商品价格的判断,不断的修改规则,在业务划分上,这类的业务功能被称为风险控制,因此学习规则文件以及加载执行规则文件的规则引擎则是我自己对于风险控制领域业务领域理解的必要前提。

Drools语法

package 逻辑包名 
dialect 方言名称
import 导入的需要进入规则的对象类型(如需规则使用则要预先将其存入引擎内存)

function 函数名称(args){脚本语句...}

query 查询名称(与规则名称一致需要为双引号包裹)(args){
    $result: 规则Pattern
end
}

rule “规则名称”
attributes (属性说明,例如no-loop防止死循环)
when
    LHS
then
    RHS
end

LHS关键语法释义

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关键语法释义

通常来看RHS是通过条件判断时,需要执行的逻辑代码,不应该存在判断逻辑。

推荐JAVA业务逻辑触发方式:

  1. 编写SpringHolder静态导入Bean对象,执行需要执行的service代码。
  2. 删除部分适配的fact对象,脚本外部编写监听器监听对象消除时执行业务逻辑。
  3. 注册规则引擎自带的Channel实现channels[通道名].send()发送消息,同时Java代码内部订阅此通道即可。

规则引擎提供的快速访问修改working memory内存对象中的方法有:新增insert、修改update、删除retract。其次提供外宏对象drools调用更多API,kcontext宏对象直接访问运行时working memory内部的fact对象。

函数function用法释义

需要注意的是drools自带的function函数类似于JavaScript中的函数,但是在规则引擎中,一般的function函数需要返回一个布尔类型或者带返回类型,规范用法则是在LHS中使用eval(function(args))进行使用。

查询query用法释义

这里的查询代码相当于LHS部分,只是它需要以end结束,告知引擎本次查询结束,可以接收返回值,根据返回值决定后续流程。

query ”query_user_name“(arg){
    $user: User(name = arg)
end  
}

注:global关键字与Java中的final static基本一致,在同一个session中可以全局共享使用。

针对Drools属性的说明

位置在举例代码中的attributes即是Drools规则的属性

常见的属性配置有:Salience优先级(规则的优先级越高越先执行,默认为0)、no-loop(防止规则的死循环执行,值为false时可能会由规则引擎循环执行)、date-effective(日期计划,当日期到达后面的值时才会执行规则)、date-expires(日期比较,当日期超过后面的日期时才会执行)、Dialect(定义规则中的方言类型,一般分为eval与java)、Enable(规则是否启用)、lock-on-active(规则限制只运行一次)、activation-group(规则分组)。

Drools核心类型说明

  1. fact:类似于Java对象的引用,如果调用kieSession.insert( javaBean对象)方法,那么就会在working memory中插入一个JavaBean对象的引用。这个fact指的就是这次插入JavaBean的引用对象(引用对象即为装着源对象地址的对象,访问时直接拿到地址访问源对象)
  2. KieServices:类似于规则引擎提供的操作中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作(通过KieServices.Factory.get() 获得)
  3. KieBase:可以理解为一个知识仓库,包含了若干的规则、流程、方法等,在 Drools 中主要就是规则和方法,KieBase 本身并不包含运行时的数据之类的,如果需要执行规则 KieBase中的规则的话,就需要根据 KieBase 创建 KieSession(通过KieContainer.getKieBase() 或 newKieBase()获得)
  4. KieContainer: KieBase 的容器,利用 KieContainer 来访问 KBase 和 KSession 等信息;(通过KieServices.newKieContainer()获得)
  5. KieSession:跟 Drools 引擎打交道的会话,基于 KieBase 创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算;分为两类:有状态的 KieSession(在多次与规则引擎进行交互中,维护会话的状态)、无状态的 StatelessKieSession(隔离了每次与规则引擎的交互,不会维护会话的状态)(通过KieBase.newStatelessKieSession() 或 newKieSession()获得)
  6. KieRepository:单例对象,它是一个存放 KieModule 的仓库
  7. KieProject:KieContainer 通过 KieProject 来初始化、构造 KieModule,并将 KieModule 存放到 KieRepository 中,然后 KieContainer 可以通过 KieProject 来查找 KieModule 定义的信息,并根据这些信息构造 KieBase 和KieSession
  8. ClasspathKieProject:ClasspathKieProject 实现了 KieProject 接口,它提供了根据类路径中的 META-INF/kmodule.xml 文件构造 KieModule 的能力,也就是我们能够基于 Maven 构造 Drools 组件的基本保障之一

设计实现运行Drools规则引擎的方法

  1. java硬编码嵌入规则到Java程序中,利用KieHelper().addContent(DRL硬编码字符串,ResourceType.DRL).build方法获取一个KieBase对象,通过KieBase对象获取KieSession会话,通过KieSession对象的execute方法传入判断的JavaBean运行。
  2. 创建规则文件夹,动态的利用Resource类获取文件对象,利用KieHelper对象的addResource方法传入规则文件resource对象,后续与(1)类似。
  3. 设计创建spring-drools.xml文件,将规则文件夹全部添加进配置文件中。后续利用注解配置类即可:
@Configuration
@ImportResource("classpath:spring-drools.xml")
public class DroolsBeansConfig {

}

设计可实现的风控系统架构

主体思路:将规则条件封入字典表或枚举中,所有的规则导入规则表中,实例化配置javaBean,专门执行规则的加载与执行。

待更新......

相关资料

Maven依赖:

<dependency>
   <groupId>org.kie</groupId>
   <artifactId>kie-spring</artifactId>
   <version>7.55.0.Final</version>
</dependency>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForestSpringH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值