23、看看Drools都为我们做了那些事

文章大部分引用了他人的总结,如果原创有看到希望不要介意,有什么问题也可直接来找我。
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组件的基本保障之一。
..
那我们看一下 Drools API是如何实现的规则的

KieServices ks = KieServices.Factory.get()

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

KieContainer kc = ks. getKieClasspathContainer()

得到的KieServices 通过调用方法读取配置文件然后得到Kie容器
[code]public KieContainer getKieClasspathContainer () {
        return getKieClasspathContainer( findParentClassLoader() );
}


ClassLoader是类加载器,用来加载Java类到Java虚拟机。首先根据findParentClassLoader()获得类加载器,然后把相关的父类父接口都放进类加载器中。  
接着调用getKieClasspathContainer(ClassLoader loader),返回当前存在的KieContainer或者实例化一个KieContainer返回。 
实例化新的Container返回:
[code]public KieContainer newKieClasspathContainer(ClassLoader classLoader) {
        return new KieContainerImpl(new ClasspathKieProject(classLoader, listener), null);
    }


ClasspathKieProject主要作用是根据根据类路径中的META-INF/kmodule.xml文件构造KieModule。那它是什么时候进行构造呢? 

是在ClasspathKieProject实例化然后传入KieContainerImpl的构造函数中:
[code] public KieContainerImpl(KieProject kProject, KieRepository kr) {
        this.kr = kr;
        this.kProject = kProject;
        kProject.init();//这才是关键
    }
调用的是ClasspathKieProject实现的KieProject的init()方法
[code]public void init() {
        this.classLoader = createProjectClassLoader(parentCL);
        discoverKieModules();
        indexParts(kieModules.values(), kJarFromKBaseName);
    }

discoverKieModules()

很关键的一个方法,他通过两个路径KMODULE_JAR_PATHKMODULE_SPRING_JAR_PATH来查找相应的META-INF下的kmodule.xml或者是kmodule-spring.xml,通过这两个配置文件来构造相应的kieModules。然后将得到的KieModules放入Map


[code]String[] configFiles = {KieModuleModelImpl.KMODULE_JAR_PATH, KieModuleModelImpl.KMODULE_SPRING_JAR_PATH};
比如我在META-INF中放了一个kmodule.xml,Jar包中引入了一个drools-examples-6.2.0.CR4.jar,因此里面也有一个kmodule.xml。

indexParts(..)

[code]protected void indexParts(Collection<InternalKieModule> kieModules,Map<String, InternalKieModule> kJarFromKBaseName);
源码太长不引入了,主要功能是根据上一步的到的kieModules,获得相应KieModuleModel、KieBaseModel、KieSessionModel然后放入AbstractKieProject所对应的Map以及对象中。
[code]private KieBaseModel defaultKieBase = null; 
private KieSessionModel defaultKieSession = null; 
private KieSessionModel defaultStatelessKieSession = null;


这些用来放Kmodule.xml中定义为default的KieBase、KieSession、StatelessKieSession。而这边只有一个对象,所以为什么默认的只有一个的缘故。当然要是有多个,newKieSession()怎么知道哪一个。
[code]protected final Map<String, KieBaseModel>    kBaseModels;
Map<KieBaseModel, Set<String>> includesInKieBase;
protected final Map<String, KieSessionModel> kSessionModels;


之后我们都是通过KieSession的name找到相应KieSessionModel,通过KieBase的name找到相应的KieBaseModel。然后通过相应的KieSessionModel、KieBaseModel来得到相应的KieSession以及KieBase。

KieSession ksession = kc.newKieSession(“HelloWorldKS”);

[code]KieSession ksession = kc.newKieSession("HelloWorldKS");
KieBase kiebase = kc.getKieBase("kieBase");
[code] public KieSession newKieSession(String kSessionName, Environment environment, KieSessionConfiguration conf) {
        //传入的environment、conf都是null。KieSessionConfiguration用法在Drools6新特性中有提到过。
        KieSessionModelImpl kSessionModel = (KieSessionModelImpl) getKieSessionModel(kSessionName);
        //DO1 验证是否找到相应的Model
        //DO2 验证生成Model是否是StateFul,默认生成的KieSession都是stateFul
        //DO3 找到相应的KieBase
        //DO4 根绝KieBase以及KSessionModel生成相应的KieSession
        //DO5 放入一个存储有状态的KieSession的Map,之后可以在需要的时候先从Map里面找。 
    }
ksession.insert( message );
[code]public FactHandle insert(final Object object) {
        return insert( object, /* Not-Dynamic */
 null,false,false,null,null );
 }
[code]public FactHandle insert(final Object object,final Object tmsValue,final boolean dynamic,boolean logical,final RuleImpl rule,final Activation activation) {
        checkAlive();
        return this.defaultEntryPoint.insert( object,
tmsValue,dynamic,logical,rule,activation );
}

下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的

----请看下方↓↓↓↓↓↓↓

百度搜索 Drools从入门到精通:可下载开源全套Drools教程

深度Drools教程不段更新中:


更多Drools实战陆续发布中………

扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值