您的位置:首页 > 其它

Drools 草稿

2015-12-21 00:00 561 查看
http://blog.csdn.net/luzhenyu111/article/details/44004121

这里引用Drools-6.1.0.Final 入门文档 中的介绍来介绍这个特性:

Drools推出了一套新的基于KIE概念的API,其目的是将之前版本中对规则引擎繁琐的调用和加载过程加以简化。

Drools6给我的最大不同就是把rules打包成jar,使用端通过kie-ci来动态从maven repo中获取指定rules jar版本,虽然和maven有紧耦合,简化以及清晰了rules的使用和动态升级:系统建立2个项目:一个Drools项目来实现规则,验收规则,生成jar包,另外一个就是真正要用规则的项目,直接通过引入不同版本的jar包实习规则动态升级。

引入新的算法PHREAK,官方文档的意思是能让Drools处理大量的规则以及事实。我没有找到太多关于PHREAK算法的资料,有空再去研究下吧。

Automatically firing timed rule in passive mode.这什么意思,大致指的是Drools默认情况下是惰性的执行规则,即除非你调用了fireAllRules(),不然他不会执行规则的。而现在有一个Drools加了个新特性,能让你改变默认的行为,他会自动执行规则。

关于整合的新特性,我觉得不错的估计就是Spring以及CDI,之前版本就能与Spring整合了,而现在是可以用Spring的配置文件来代替kmodule.xml。在我看源码的时候发现,Drools在运行的时候会到META-INF下面查找名为kmodule-spring.xml的配置文件。

关于Drools规则如何编写,KModule.xml如何写,如何调用规则这些请参考Drools-6.1.0.Final_入门文档。

我想通过对源码的解析来介绍KIE API为我们方便的操控引擎做了哪些事情。

KIE的API中有以下的几个类和接口需要介绍下:

KieServices

该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KSession等信息;可以获取KieRepository对象,利用KieRepository来管理KieModule等。

KieServices就是一个中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作。

KieContainer

可以理解KieContainer就是一个KieBase的容器。

KieBase

KieBase就是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就需要根据KieBase创建KieSession。

KieSession

KieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算。我们通过KieContainer创建KieSession是一种较为方便的做法,其实他本质上是从KieBase中创建出来

KieRepository

KieRepository是一个单例对象,它是一个存放KieModule的仓库,KieModule由kmodule.xml文件定义(当然不仅仅只是用它来定义)。

KieProject

KieContainer通过KieProject来初始化、构造KieModule,并将KieModule存放到KieRepository中,然后KieContainer可以通过KieProject来查找KieModule定义的信息,并根据这些信息构造KieBase和KieSession。

ClasspathKieProject

ClasspathKieProject实现了KieProject接口,它提供了根据类路径中的META-INF/kmodule.xml文件构造KieModule的能力,也就是我们能够基于Maven构造Drools组件的基本保障之一。

KieServices ks = KieServices.Factory.get()

KieServices实际上是一个接口,但是接口中有一个静态工厂用来得到实例化的KieServicesImpl.

KieContainer kc = ks. getKieClasspathContainer()

得到的KieServices 通过调用方法读取配置文件然后得到Kie容器。

FROM:http://wenku.baidu.com/link?url=LH82Rui8zYkSDYrDNJDR7JSEouf60KkwODY8WqO8x4JlpTdArq5Gmlxh3MEZxTpBQHwgeMIF6r5g7KZeKYrZ7RdrpNRjbIskoaW-I8CwP9i###

关于Drools规则如何编写,KModule.xml如何写,如何调用规则这些请参考Drools-6.1.0.Final_入门文档。

我想通过对源码的解析来介绍KIE API为我们方便的操控引擎做了哪些事情。

KIE的API中有以下的几个类和接口需要介绍下:

KieServices

该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KSession等信息;可以获取KieRepository对象,利用KieRepository来管理KieModule等。

KieServices就是一个中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作。

KieContainer

可以理解KieContainer就是一个KieBase的容器。

KieBase

KieBase就是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就需要根据KieBase创建KieSession。

KieSession

KieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算。我们通过KieContainer创建KieSession是一种较为方便的做法,其实他本质上是从KieBase中创建出来

KieRepository

KieRepository是一个单例对象,它是一个存放KieModule的仓库,KieModule由kmodule.xml文件定义(当然不仅仅只是用它来定义)。

KieProject

KieContainer通过KieProject来初始化、构造KieModule,并将KieModule存放到KieRepository中,然后KieContainer可以通过KieProject来查找KieModule定义的信息,并根据这些信息构造KieBase和KieSession。

ClasspathKieProject

ClasspathKieProject实现了KieProject接口,它提供了根据类路径中的META-INF/kmodule.xml文件构造KieModule的能力,也就是我们能够基于Maven构造Drools组件的基本保障之一。

KieServices ks = KieServices.Factory.get()

KieServices实际上是一个接口,但是接口中有一个静态工厂用来得到实例化的KieServicesImpl.

KieContainer kc = ks. getKieClasspathContainer()

得到的KieServices 通过调用方法读取配置文件然后得到Kie容器。

kbase下可以有多个ksesion

kiemodule 和kiebase只会创建一次,而kiesesion则可能创建多次,因为kiesesion的创建成本很低,

同时kiesession包含了运行时的数据,所以可以销毁、创建若干次。

kie框架先初始化一个kieservice对象

从classpath中读取kmodule,创建kiecontainder 容器

利用kiecontainer对象创建新的kiesession,创建session的时候,我们传人一个name ksession-rule

这就是kmodule.xml文件中定义的kesession的name.Kiecontainer根据kmodule.xml定义的ksession的名字

找到kiesession的定义,然后创建一个kiesession的实例。

kiesession就是一个到规则引擎的链接,通过他就可以跟规则引擎通讯,并且发起执行规则的操作。

通过ksession.insert 方法将事实(Fact)插入到引擎中,也就是working memory中。

然后通过ksession.fireallRules方法通知规则引擎执行规则。

drools规则的性能跟if else比较哪个好
1.一样的If--Then 句式与Rete引擎
三者都会把原来混乱不堪的if---else---elseif----else谜团,
拆成N条带优先级的"If 条件语句 then 执行语句" 的句式。

三者都主要使用foreward-chaining的Rete引擎,按优先级匹配条件语句,执行规则语句。
规则执行后会引发事实的变化,引擎又会重新进行条件匹配,直到不能再匹配为止,Rete的算法保证了效率的最高。
2.开发人员使用的规则语言
2.1 Drools的XML框架+Java/Groovy/Python嵌入语言
Drools的用XML的<Conditons>、<Consequence> 节点表达If--Then句式,而里面可以嵌入上述语言的代码作为判断语句和执行语句。
其中Java代码会使用Antlr进行解释,而Groovy和Python本身就是脚本语言,可以直接调用。
Drools的聪明之处在于,用XML节点来规范If--Then句式和事实的定义,使引擎干起活来很舒服。
而使用Java,Groovy等原生语言来做判断和执行语句,让程序员很容易过渡、移植,学习曲线很低。

Rete 算分核心是将分离的匹配项更据内容动态构造匹配树,以达到降低计算量的效果
Drools
OpenRules
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: