drools-kie API 和kmodule.xml 文件详解
本文结构
1. 什么是KIE?
2. kieServices和kieContainer
3. 然后逐个介绍这些对象
4. kmodule.xml
1. 什么是KIE?
KIE是jBoss里面一些相关项目的统称,下图就是KIE代表的一些项目,其中我们比较熟悉的就有jBPM和Drools。
这些项目都有一定的关联关系,并且存在一些通用的API,比如说涉及到构建(building)、部署(deploying)和加载(loading)等方面的,这些API就都会以KIE作为前缀来表示这些是通用的API。前面看到的一些KieServices、KieContainer、KieSession类就都是KIE的公共API。
总的来说,就是jBoss通过KIE将jBPM和Drools等相关项目进行了一个整合,统一了他们的使用方式。像KieServices这些KIE类就是整合后的结果,在Drools中这样使用,在jBPM里面也是这样使用。
2. kieServices和kieContainer
通过KieServices对象得到一个KieContainer,利用kieContainer对象创建一个新的KieSession,
创建session的时候我们传入了一个name:“ksession-name”,这个字符串很眼熟吧,这个就是我们定义的kmodule.xml文件中定义的ksession的name。kieContainer根据kmodule.xml定义的ksession的名称找到KieSession的定义,然后创建一个KieSession的实例。
KieSession就是一个到规则引擎的链接,通过它就可以跟规则引擎通讯,并且发起执行规则的操作。
通过kSession.insert方法来将事实(Fact)插入到引擎中,也就是Working Memory中。
然后通过kSession.fireAllRules方法来通知规则引擎执行规则。
3. 然后逐个介绍这些对象
KieServices:
该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KSession等信息;可以获取KieRepository对象,利用KieRepository来管理KieModule等.
KieServices就是一个中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作。
KieContainer:
可以理解KieContainer就是一个KieBase的容器,KieBase是什么呢?KieBase:
KieBase就是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就需要根据KieBase创建KieSession。
KieSession:
KieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算。我们通过KieContainer创建KieSession是一种较为方便的做法,其实他本质上是从KieBase中创建出来。的。
KieSession就是应用程序跟规则引擎进行交互的会话通道。
创建KieBase是一个成本非常高的事情,KieBase会建立知识(规则、流程)仓库,而创建KieSession则是一个成本非常低的事情,所以KieBase会建立缓存,而KieSession则不必。
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组件的基本保障之一。
意味着只要我们按照前面提到过的Maven工程结构组织我们的规则文件或流程文件,我们就能够只用很少的代码完成模型的加载和构建。
现在我们知道了可以通过ClasspathKieProject来解析kmodule.xml文件来构建KieModule。
在ClasspathKieProject类中,会根据kmodule.xml文件的定义,将其解析并生成成KieModuleModel、KieBaseModel、KieSessionModel对象,基于这个原理,那么我们也可以抛开kmodule.xml文件,通过编程的方式创建这些Model对象。
在运行时,KieContainer会根据Model对象来创建KieModule、KieBase、KieSession对象。其中KieModule和KieBase只会创建一次,而KieSession则有可能创建多次,因为KieSession的创建成本很低,同时KieSession包含了运行时的数据,所以可以销毁、创建若干次。
4. 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="SimpleRuleKBase" packages="com.us.person">
<ksession name="simpleRuleKSession"/>
</kbase>
</kmodule>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
• kmodule里面包含了一个到多个kbase,,分别对应drl规则文件的例子。
• 每一个kbase都有一个name,可以取任意字符串,但是不能重名。
• 然后都有一个packages,可以看到packages里面的字符串其实就是src/main/resources下面的文件夹的名称,或者叫包名,规则引擎会根据这里定义的包来查找规则定义文件。可以同时定义多个包,以逗号分隔开来就行。
• 每一个kbase下面可以包含多个ksession,当然本例中都自定义了一个。
• 每一个ksession都有一个name,名字也可以是任意字符串,但是也不能重复。
• kbase和ksession里面的name属性是全局不能重复的。
• kbase和ksession中其实还有很多其它的属性,但是在这里不是很重要,就先不提了,后面我们会一一讲解的。
属性
kmodule.xml文件中的kbase和ksession标签都有很多的属性,这些属性映射到Java对象的时候就对应着相关的对象的字段,下面我们详细了解一下有那些属性:
kbase属性
上一篇: 每日学习-Java基础(十)接口和继承12(综合练习)
下一篇: 浅谈 Oracle 监听器