drools入门笔记

简介

Drools是一款基于Java的开源规则引擎,实现了将业务决策从应用程序中分离出来。

优点:

  • 简化系统架构,优化应用
  • 提高系统的可维护性和维护成本
  • 方便系统的整合
  • 减少编写“硬代码”业务规则的成本和风险

Fact对象:

指传递给drools脚本的对象,是一个普通的javabean,原来javaBean对象的引用,可以对该对象进行读写操作,并调用该对象的方法
当一个java bean插入到working Memory(内存存储)中,规则使用的是原有对象的引用,规则通过对fact对象的读写,
实现对应用数据的读写,对其中的属性,需要提供get和set方法,规则中可以动态的前往working memory中插入删除新的fact对象

Drools的基础语法:

包路径,引用,规则体 (其中包路径和规则体是必须的)

package rules.testword
rule "test001"
  when 
    //这里如果为空,则表示eval(true)
  then
    System.out.println("hello word");
end
  • package:包路径,该路径是逻辑路径(可以随便写,但是不能不写,最好和文件目录同名,以(.)的方式隔开),规则文件中永远是第一行
  • rule:规则体,以rule开头,以end结尾,每个文件可以包含多个rule ,规则体分为3个部分:LHS,RHS,属性 三大部分
  • LHS:(Left Hand Side),条件部分,在一个规则当中“when”和“then”中间的部分就是LHS部分,在LHS当中,可以包含0~N个条件,如果LHS为空的话,那么引擎会自动添加一个eval(true)的条件,由于该条件总是返回true,所以LHS为空的规则总是返回true。
  • RHS:(Right Hand Side),在一个规则中“then”后面的部分就是RHS,只有在LHS的所有条件都满足的情况下,RHS部分才会执行。RHS部分是规则真正做事情的部分,满足条件触发动作的操作部分,在RHS可以使用LHS部分当中的定义的绑定变量名,设置的全局变量、或者是直接编写的java代码,可以使用import的类。不建议有条件判断。可以使用快速操作working Memory的宏函数和对象,比如insert/insertLogical,update/modify和retract就可以实现对当前Working Memory中的Fact对象进行新增,修改,或者删除,可以使用drool宏对象,Drools还提供了kcontext的宏对象,该对象可以直接访问当前Working Memory的KnowledgeRuntime。
  • import:导入规则文件需要使用到的外部变量,可以导入类,也可以是这个类中的静态方法
    例如:
          import com.dinpay.dpp.rcp.service.util.RuleLogUtil; 导入类
          import com.dinpay.dpp.rcp.service.util.RuleLogUtil.getLog;//导入静态方法

Drools的API调用

API可以分为三类:规则编译,规则收集,规则执行

  1. Kmodule.xml的编译
    存放在src/main/resources/META-INF/文件夹下
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules.testword">
        <ksession name="session"/>
    </kbase>
</kmodule>
  • 可包含多个kbase,任意但不能重名
  • 有个packages,就是src/main/resources下面的文件夹名称,可定义多个包,用逗号隔开
  • ksession都有一个name,任意字符串但不能重名,可以有多个
  • 在运行时、KieContainer会根据*Model对象来创建KieModule,KieBase,KieSession对象,其中KieModule和KieBase只会创建一次,而KieSession则可能创建多次
  1. KieSession
    用于与规则引擎进行交互的会话
    分为两类:
  • 有状态KieSession:KieSession会在多次与规则引擎进行交互中,维护会话状态,type属性值是stateful,最后需要清理KieSession维护的状态,调用dispose()方法

  • 无状态StatelessKieSession:StatelessKieSession隔离了每次与规则引擎的交互,不会维护会话状态,无副作用,type属性值是stateless

    应用场景:数据校验,运算,数据过滤,消息路由,任何能被描述成函数或公式的规则

标准的规则文件的结构代码

package package-name(包名,必须的,只限制于逻辑上的管理,若自定义查询或者函数属于同一个包名,不管物理位置如何,都可以调用)
imports (需要导入的类名)
globals (全局变量)
functions (函数)
queries (查询)
rules (规则,可以多个)

编码

maven依赖

<dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-api</artifactId>
    <version>6.5.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>6.5.0.Final</version>
</dependency>
<!-- Drools规则引擎包 end -->

编写drl规则文件

编写kmodule.xml

配置文件告诉代码规则文件drl在哪里,放置到resources/META-INF目录下

编写DroolsUtil

通过该类加载kmodule.xml文件,并获得KieSession

执行规则

基于数据库的方式

表结构

获取KieSession

执行规则

https://www.jianshu.com/p/e713860b128e

发布了202 篇原创文章 · 获赞 6 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/fall_hat/article/details/104692176