Drools入门(二)——组件讲解

KieFileSystem

文件系统,用来存放构建规则引擎所需要的规则文件,以及构建规则时其他的组件配置信息,当规则构建过程中会将该文件系统的所有相关文件拷贝到MemoryFileSystem作为构建规则的文件系统使用,即当初始化完成后KieFileSystem里面的修改将不会对规则引擎有影响

KieModuleModel

全局模块管理器,一个规则引擎有且仅有一个全局模块,以xml的形式进行定义,可以理解为maven的pom文件的project节点,定义路径为src/main/resources/META-INF/kmodule.xml,路径源码中已规定不得修改,如果项目没有指定kmodule.xml文件,则默认生产一份默认的配置文件,内容如下


  
    
    
  

源码在KieBuilderImpl.classbuildKieModuleModel()方法,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 buildPackageDescr() {
    Map 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 packages, ResourceType resourceType, ResourceToPkgDescrMapper mapper) {
    List 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.classnewKieSession()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

最终容器,存放上述所有内容,同时用作生成KieSessionStatelessKieSession及规则引擎的版本控制

你可能感兴趣的:(Drools入门(二)——组件讲解)