什么是规则引擎?
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
规定引擎的代表有哪些?
①: Ilog JRules 是最有名的商用BRMS;
②:Drools 是最活跃的开源规则引擎;
③:Jess 是Clips的java实现,就如JRuby之于Ruby,是AI系的代表;
④:Visual Rules(旗正规则引擎)国内商业规则引擎品牌。
本次我们主要讲解drools规定引擎
①:什么是drools规则引擎
Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。
通俗讲:就是将规则从业务抽离出来
②:规则引擎的执行原理
通俗的讲我们都是通过调用接口来做事情。首先要穿进入参数,其次要获取到接口的实现执行完毕后的结果。规则引擎也是一样。我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。在drools中,这个传递数据进去的对象,术语叫 Fact对象。Fact对象是一个普通的java bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法,当一个java bean插入到workingMemory中,规则使用的是原有对象的引用,规则通过对fact对象的读写,实现对应用数据的读写,对于其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的fact对象。
③:drools 规则引擎的语法结构
规则引擎使用.drl文件 ,也可以使用 xml 文件 这里我们使用.drl文件
规程引擎的语法结构:
package com.rules
import com.wumengxin.drools.model.Person;
rule "query-test"
agenda-group "query-test-group1"
when
$person : Person()
then
System.out.println("The rule query-test fired!");
end
query "query-1"
$person : Person(age > 30)
end
query "query-2"(String nameParam)
$person : Person(age > 30,name == nameParam)
end
package:对一个规则文件而言,package是必须定义的,必须放在规则文件第一行。特别的是,package的名字是随意的,不必必须对应物理路径,跟java的package的概念不同,这里只是逻辑上的一种区分。同样的package下定义的function和query等可以直接使用
比如:
import:导入规则文件需要使用到的外部变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。
rule:定义规则 如:rule helloSomeone
agenda-group:
① 如果没有指定agenda-group 则默认把所有未指定agenda-group的 rules 都执行一遍
②. 如果指定了agenda-group 使用的时候必须指定该name才能被使用,默认是不能使用的
③. agenda-group name可以重复
④. agenda-group 用于区分rule
说明:规则的调用与执行是通过StatelessSession 或StatefulSession 来实现的,一般的顺序是创建一个StatelessSession 或StatefulSession,将各种经过编译的规则的package 添加到session当中,接下来将规则当中可能用到的Global对象和Fact对象插入到Session 当中,最后调用fireAllRules 方法来触发、执行规则。在没有调用最后一步fireAllRules方法之前,所有的规则及插入的Fact对象都存放在一个名叫Agenda表的对象当中,这个Agenda表中每一个规则及与其匹配相关业务数据叫做Activation,在调用fireAllRules方法后,这些Activation 会依次执行,这些位于Agenda 表中的Activation 的执行顺序在没有设置相关用来控制顺序的属性时(比如salience 属性),它的执行顺序是随机的,不确定的。Agenda Group 是用来在Agenda 的基础之上,对现在的规则进行再次分组,具体的分组方法可以采用为规则添加agenda-group属性来实现。agenda-group 属性的值也是一个字符串,通过这个字符串,可以将规则分为若干个Agenda Group,默认情况下,引擎在调用这些设置了agenda-group 属性的规则的时候需要显示的指定某个Agenda Group 得到Focus(焦点),这样位于该Agenda Group 当中的规则才会触发执行,否则将不执行。
下载地址:https://download.csdn.net/download/wumengxin55/11007098