看看Drools为我们了什么事

2024-08-29 06:18
文章标签 看看 drools

本文主要是介绍看看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容器。

[source code]public KieContainer getKieClasspathContainer () {return getKieClasspathContainer( findParentClassLoader() );}

ClassLoader是类加载器,用来加载Java类到Java虚拟机。首先根据findParentClassLoader()获得类加载器,然后把相关的父类接口都放进类加载器中。 

接着调用getKieClasspathContainer(ClassLoader loader),返回当前存在的KieContainer或者实例化一个KieContainer返回。 

实例化新的Container返回:

	[source code]public KieContainer newKieClasspathContainer(ClassLoader classLoader) {return new KieContainerImpl(new ClasspathKieProject(classLoader, 			listener), null);}

ClasspathKieProject主要作用是根据类路径中的META-INF/kmodule.xml文件构造KieModule。那它是什么时候进行构造呢?是在ClasspathKieProject实例化然后传入KieContainerImpl的构造函数中:

	[source code] public KieContainerImpl(KieProject kProject, KieRepository kr) {this.kr = kr;this.kProject = kProject;kProject.init();//这才是关键}

调用的是ClasspathKieProject实现的KieProject的init()方法

	[source code]public void init() {this.classLoader = createProjectClassLoader(parentCL);discoverKieModules();indexParts(kieModules.values(), kJarFromKBaseName);}

discoverKieModules()

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


	[source code]String[]  configFiles = {KieModuleModelImpl.KMODULE_JAR_PATH,KieModuleModelImpl.KMODULE_SPRING_JAR_PATH};

分析完部分源码后,我们再回头看API的说明

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

KieBase kiebase = kc.getKieBase("kieBase");

[source 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 );

[source code]
public FactHandle insert(final Object object) {return insert( object, /* Not-Dynamic */null,false,false,null,null );}
[source 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实战陆续发布中………

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



这篇关于看看Drools为我们了什么事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117080

相关文章

每个游戏公司的领导都应该看看Supercell的“十年总结”

我知道,你一定会说,Supercell的案例太特殊了。手游出现以来,全世界就只有这么一个Supercell,它的经历、理念和公司架构这些文化,其他公司学不来,不管对中国公司还是海外公司,都没有什么实际借鉴意义。 但Supercell真的有这么“特殊”吗? 比如他们对于留存数据的看重,尤其是测试期留存的看重,和国内——和任何一家常规游戏公司看重留存的态度,都没有什么明显不同。 他们也会试着设立

全网第一份 | Flink学习面试灵魂40问,看看你能答上来几个?

《2021年最新版大数据面试题全面开启更新》 答案将在下期给出。   概念和基础篇   简单介绍一下Flink Flink相比传统的Spark Streaming有什么区别?和Spark中的structured streaming 相比呢?Flink相比ss和storm有什么优势? Flink的组件栈是怎么样的? Flink的基础编程模型了解吗?

挺好的一篇总结文(等有空时看看)

http://www.cocoachina.com/industry/20140609/8732.html 行走于Swift的世界中 发布于:2014-06-09 09:49阅读数:13127 Swift并不像我上一篇表达自己初步看法的文章里所说的那样,相对于objc来说有更好的学习曲线。Swift在漂亮的语法之后其实隐藏了很多细节和实现,而如果无法理解这些细节和实现,就很难

如何设计日志采集系统?不妨看看这篇文章

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取 来源:r6d.cn/9K3Q 概述 日志从最初面向人类演变到现在的面向机器发生了巨大的变化。最初的日志主要的消费者是软件工程师,他们通过读取日志来排查问题,如今,大量机器日夜处理日志数据以生成可读性的报告以此来帮助人类做出决策。在这个转变的过程中,日志采集Agent在其中扮演着重要的角色。 作为一个日志采集的Agent简单来看其

看看SpringBoot的自动装配原理

SpringBoot的自动装配原理 明天面试浅浅复习一下八股文 面试官:说一下springboot的自动装配 像以前开发的时候,配置文件需要用xml和java配置类进行显式配置,一整就整一大堆的配置文件 then 什么是自动装配? Spring boot 定义了一套自己的规范,在Spring Boot启动的时候会扫描有什么外部的jar包的META-INF/spring.fac

周日随便看看

 1.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思 Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。 2.JDBC是什么意思 JDBC是允许用户在不同数据库之间做

【drools】kie:官方仓库clone 遇到问题解决

git clone https://github.com/kiegroup/drools.git这个与apache的还有不同。 代码比较多,考验代理能力 zhangbin@LAPTOP-Y9KP MINGW64 /d/Future$ rm -rf drools/zhangbin@LAPTOP-Y9KP MINGW64 /d/Future$ git clone https://gi

来看看两种好玩的方法,扩展方法和分部方法

好久没过来扯淡了,话说这年头还有偶遇的事情吗?比如国庆回家的汽车上有个妹子要你qq,要你微信,想着法子跟你聊天,然后睡了一觉,醒来发现 肾不见了?小花絮小花絮,要是肾真没了,也吹不了牛,败不了火了,继续言归正传。   一:扩展方法        说到扩展方法,我想大家都已经再熟悉不过了,也许你的解决方案中有无数个这样的扩展方法,自从有了Linq之后,我们的集合就再也不单纯了。

【drools】电影推荐搭建

同步用了很久很久 反复了很多了次,最终: drools用的都是9.*** Y9KP 代码 D:\Future\06_movie-recommendation-system-springboot-drools-rule-engine\recommendation\src\main\resources\com.recommendation.movie.rules\medicine_

Drools的API调用

在上一章节里,小编简单的讲述了规则文件的编辑语法与规范,读者还没有看过rule的执行过程,下面我们就通过例子对rule进行一下调用。在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现,这些API总体来讲可以分为三类:规则编译、规则收集和规则的执行。 在调用时,我们先要做以下几个操作: 1、Kmodule.xml的编辑 kmodule.xml文件放到src/main/