写点什么

Drools 入门

用户头像
LeifChen
关注
发布于: 1 小时前

概述


Drools 是一款基于 Java 语言的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(这里可以是数据库表),使得业务规则的变更不需要修正项目代码、重启服务器就可以在线上环境立即生效。


Drools 规则引擎是为开发人员提供的 KRR 功能程序,KRR 是人工智能的核心,所以 Drools 也是人工智能的一个分支,是专家系统的另一种展现方式。

Hello Drools 示例


  • 步骤 1:pom 引入依赖

<dependencyManagement>	<dependencies>		<dependency>			<groupId>org.drools</groupId>			<artifactId>drools-bom</artifactId>			<type>pom</type>			<version>7.57.0.Final</version>			<scope>import</scope>		</dependency>	</dependencies></dependencyManagement>
<dependencies> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-mvel</artifactId> </dependency></dependencies>
复制代码


  • 步骤 2:src/main/resouces 新建 rules/hello 目录,并新增规则文件 hello.drl

package rules.hello 
rule "test001" when eval(true); then System.out.println("hello drools");end
复制代码


  • 步骤 3:src/main/resources 新建 META-INF 目录,并新增 kmodule.xml

<?xml version="1.0" encoding="UTF-8"?><kmodule	xmlns="http://www.drools.org/xsd/kmodule">	<kbase name="rules" packages="rules.hello">		<ksession name="helloDrools"/>	</kbase></kmodule>
复制代码


  • 步骤 4:main 方法测试规则文件

public class RulesHello {    public static void main(String[] args) {        KieServices kss = KieServices.Factory.get();        KieContainer kc = kss.getKieClasspathContainer();        KieSession ks = kc.newKieSession("helloDrools");        int count = ks.fireAllRules();        System.out.println("总执行了" + count + "条规则");        ks.dispose();    }}
复制代码


结果:

规则文件


规则文件内容一般包含三大块,即包路径、引用、规则体。

规则文件名


规则文件名即 hello.drl,不要求首字母大写。命名规范,见名知意。

规则文件内容

package

关键字 package 为三大块中的包路径,是逻辑路径。在规则文件中关键字 package 永远在代码的第一行(规则模板除外)。

import

关键字 import 为三大块中的引用,目的是为了对象类引用。与 Java 不同的是,在引用静态方法时,需要添加 function 关键字。

rule

关键字 rule 为三大块中的规则体,是核心内容之一,以关键字 rule 开头,以 end 结尾,每个规则文件中可以包含多个 rule 规则体,但 rule 规则体之间不能交叉使用,即一个 rule 只能对应一个 end。

rule 的参数,即规则名,建议驼峰式命名,并为每一个规则名都加上引号,以避免出现编译报错的问题。

同一个规则库中相同规则逻辑路径下的规则名不可以相同,可以理解为规则名即是一个 ID,不可重复。

规则体说明


规则体是规则文件内容中的核心,分为 LHS、RHS 两大功能模块。

LHS

条件部分又被称为 Left Hand Side(LHS),即规则体 when 与 then 中间的部分。在 LHS 中,可以包含 0~n 个条件,如果 LHS 部分为空,那么引擎会自动添加一个 eval(true)条件,由于该条件总是返回 true,因此 LHS 为空的规则体也总是返回  true。LHS 条件不满足,规则体就不会执行 RHS 模块。

RHS

结果部分又被称为 Right Hand Side(RHS),即一个规则体中 then 与 end 中间的部分,只有 LHS 部分的条件都满足时 RHS 部分才会被执行。

Fact

Drools 规则引擎中传递的数据,术语称 Fact 对象。

Drools 加载规则时,会将所有规则体中的 LHS 部分先执行,区别于规则体的 RHS 部分不进行运算。只有 Fact 对象发生了改变,规则体才有可能重新被激活,之前为 false 的 LHS 有可能变成 true。

Fact 对象是一个普通的 JavaBean,规则体中可以对当前对象进行任何的读/写操作,调用该对象提供的方法。当一个 Fact 插入 Working Memory(内存储存)中,规则体使用的是原有对象的引用(并不是克隆,与 Java 变量性质相似),规则体通过操作 Fact 对象来实现对应用数据的管理,对于其中的属性,需要提供 getter/setter 方法。执行规则时,可以动态地向当前 Working Memory 插入、删除或更新 Fact 对象。


用户头像

LeifChen

关注

持续学习 2017.10.29 加入

Java 开发

评论

发布
暂无评论
Drools 入门