KieFileSystem
文件系统,用来存放构建规则引擎所需要的规则文件,以及构建规则时其他的组件配置信息,当规则构建过程中会将该文件系统的所有相关文件拷贝到MemoryFileSystem
作为构建规则的文件系统使用,即当初始化完成后KieFileSystem
里面的修改将不会对规则引擎有影响
KieModuleModel
全局模块管理器,一个规则引擎有且仅有一个全局模块,以xml
的形式进行定义,可以理解为maven的pom文件的project
节点,定义路径为src/main/resources/META-INF/kmodule.xml
,路径源码中已规定不得修改,如果项目没有指定kmodule.xml
文件,则默认生产一份默认的配置文件,内容如下
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.drools.org/xsd/kmodule">
<kbase name="defaultKieBase" default="true" eventProcessingMode="cloud" equalsBehavior="identity" declarativeAgenda="disabled" sequential="false" sessionsPool="-1" scope="javax.enterprise.context.ApplicationScoped" packages="*">
<ksession name="defaultStatelessKieSession" type="stateless" default="true" clockType="realtime" beliefSystem="simple"/>
<ksession name="defaultKieSession" type="stateful" default="true" clockType="realtime" beliefSystem="simple"/>
</kbase>
</kmodule>
源码在KieBuilderImpl.class
的buildKieModuleModel()
方法,srcMfs
为文件系统,KieModuleModelImpl.KMODULE_SRC_PATH
就是路径src/main/resources/META-INF/kmodule.xml
,检查到文件系统中不存在则创建一个默认的新的KieModuleModel
private void buildKieModuleModel() {
if ( srcMfs.isAvailable( KieModuleModelImpl.KMODULE_SRC_PATH ) ) {
kModuleModelXml = srcMfs.getBytes( KieModuleModelImpl.KMODULE_SRC_PATH );
try {
kModuleModel = KieModuleModelImpl.fromXML( new ByteArrayInputStream( kModuleModelXml ) );
} catch ( Exception e ) {
results.addMessage( Level.ERROR,
"kmodule.xml",
"kmodule.xml found, but unable to read\n" + e.getMessage() );
// Create a default kModuleModel in the event of errors parsing the XML
kModuleModel = KieServices.Factory.get().newKieModuleModel();
}
} else {
// There's no kmodule.xml, create a default one
kModuleModel = KieServices.Factory.get().newKieModuleModel();
}
if ( setDefaultsforEmptyKieModule( kModuleModel ) ) {
kModuleModelXml = kModuleModel.toXML().getBytes( IoUtils.UTF8_CHARSET );
}
}
KieBaseModel
规则基础组件,在kmodule.xml
中定义的kbase
节点,一个全局模块管理器kmodule
节点下可以包含多个kbase
节点,作用是用来对规则引擎中的规则进行模块划分,划分依据是kbase
节点上的packages
属性对应规则文件drl
中的package
,同一个package
下的所有规则将交给一个KieBaseModel
处理。
需要注意:一个
kmodule.xml
只能有一个默认的kbase
节点,缺省时能获取默认的KieBaseModel
,由kbase
节点上的default
属性设置
源码在CompositeKnowledgeBuilderImpl.class
中的buildPackageDescr()
方法
private Collection<CompositePackageDescr> buildPackageDescr() {
Map<String, CompositePackageDescr> packages = new HashMap<>();
buildResource(packages, ResourceType.DRL, ResourceToPkgDescrMapper.DRL_TO_PKG_DESCR);
buildResource(packages, ResourceType.GDRL,ResourceToPkgDescrMapper. DRL_TO_PKG_DESCR);
buildResource(packages, ResourceType.RDRL, ResourceToPkgDescrMapper.DRL_TO_PKG_DESCR);
buildResource(packages, ResourceType.DESCR, ResourceToPkgDescrMapper.DRL_TO_PKG_DESCR);
buildResource(packages, ResourceType.DSLR, ResourceToPkgDescrMapper.DSLR_TO_PKG_DESCR);
buildResource(packages, ResourceType.RDSLR, ResourceToPkgDescrMapper.DSLR_TO_PKG_DESCR);
buildResource(packages, ResourceType.XDRL, ResourceToPkgDescrMapper.XML_TO_PKG_DESCR);
buildResource(packages, ResourceType.DTABLE, ResourceToPkgDescrMapper.DTABLE_TO_PKG_DESCR);
buildResource(packages, ResourceType.TDRL, ResourceToPkgDescrMapper.DRL_TO_PKG_DESCR);
buildResource(packages, ResourceType.TEMPLATE, ResourceToPkgDescrMapper.TEMPLATE_TO_PKG_DESCR);
buildResource(packages, ResourceType.GDST, ResourceToPkgDescrMapper.GUIDED_DTABLE_TO_PKG_DESCR);
this.resourcesByType.remove(ResourceType.DRT); // drt is a template for dtables but doesn't have to be built on its own
return packages.values();
}
private void buildResource(Map<String, CompositePackageDescr> packages, ResourceType resourceType, ResourceToPkgDescrMapper mapper) {
List<ResourceDescr> resourcesByType = this.resourcesByType.remove(resourceType);
if (resourcesByType != null) {
for (ResourceDescr resourceDescr : resourcesByType) {
try {
registerPackageDescr(resourceDescr, packages, resourceDescr.resource, mapper.map(kBuilder, resourceDescr));
} catch (RuntimeException e) {
if (buildException == null) {
buildException = e;
}
} catch (Exception e) {
if (buildException == null) {
buildException = new RuntimeException( e );
}
}
}
}
}
KieSessionModel
规则引擎执行器,规则引擎加载完成后用来执行规则的使用入口,设置入参并生成最后结果集等,在kbase
节点中的ksession
节点上定义,一个kbase
节点下可以有多个ksession
节点。
KieSessionModel
分为两种,第一种是“有状态的KieSession
”、一种是“无状态的StatelessKieSession
”,由ksession
节点上的type
属性设置,type="stateful"
时是“有状态的”,type="stateless"
时是无状态的
KieSession
可以理解为web项目中的session,它与用户相关有缓存的概念,使用完时需调用dispose()
释放资源,StatelessKieSession
则相反,没有缓存与用户无关,使用后无需调用dispose()
释放资源
需要注意:一个
kmodule.xml
中两种session
只能各自有一个默认的ksession
节点,可以是在不同的kbase
节点,缺省时能获取默认的KieSessionModel
,由ksession
节点上的default
属性设置
源码在KieContainerImpl.class
的newKieSession()
和newStatelessKieSession()
//获取默认的有状态session
public KieSession newKieSession() {
return newKieSession((Environment)null, null);
}
//根据session名字获取有状态session
public KieSession newKieSession(String kSessionName) {
return newKieSession(kSessionName, null, null);
}
//获取默认的无状态session
public StatelessKieSession newStatelessKieSession() {
return newStatelessKieSession((KieSessionConfiguration)null);
}
//根据session名字获取无状态session
public StatelessKieSession newStatelessKieSession(String kSessionName) {
return newStatelessKieSession(kSessionName, null);
}
KieContainer
最终容器,存放上述所有内容,同时用作生成KieSession
和StatelessKieSession
及规则引擎的版本控制