CoreContainer,顾名思义为盛放core的容器
类属性中有很多 Handler,
无参构造方法,会先调用SolrResourceLoader的locateSolrHome方法,
关于SolrResourceLoader,通过类名来看是Solr的资源加载类,负责加载各种资源到运行环境中,通过ClassLoader以及文件读取加载类、文件资源等,也支持jndi的方式加载,以及一些url以及文件路径处理的方法。
无参构造方法新建了一个SolrResourceLoader对象后,接下来还会调用它本身下一个构造方法,public CoreContainer(SolrResourceLoader loader),然后继续往下嵌套,
这里调用了SolrXmlConfig.fromSolrHome,
这里先看下SolrXmlConfig,Solr中解析并加载solr.xml的文件的类。
分成两段看,首先是返回NodeConfig以from开头的一些静态方法,这些方法是配置加载的核心方法,通过名字来看Solr支持通过不同方式加载配置文件
这里再看下NodeConfig对象,类似于一个javaBean属性的文件,每个私有属性都对应着solr.xml定义的字段,构造方法接收参数初始化这些字段,这些类属性有各自的get set方法。
回头我们再看SolrXmlConfig,首先是Config对象,JavaBean属性的类,类初始化时根据接收的参数不同,初始化私有类属性,并提供get set方法操作属性。先来看下类属性都存储了哪些信息(哪些Config,也就是Solr的哪些配置放在这里面),我们主要看下参数最多的构造方法,Solr启动时,solrconfig.xml elevate.xml配置文件的加载都用到了Config类,这里说一下solrconfig.xml并没有用到这个SolrXmlConfig
接下来大概看下Config类里都有什么
再回来看SolrXmlConfig的from*方法就很容易懂了
fromConfig:从Config类中初始化NodeConfig 也是formFile 进入formInputStream 然后被调用的
formFile:从File文件中初始化NodeConfig
formInputStream:new了一个Config对象,然后调用了formConfig
formSolrHome :调用了FromFile
整体调试下来,SolrXmlConfig,就是用来加载处理Solr.xml的类,看一开始的SOLR_XML_FILE也知道
这时再看这些构造方法就好理解多了,看到倒是第二个构造方法从参数看起来,还涉及到看起来比较陌生的一个类CoresLocator
CoresLocator是一个接口,我想把它翻译成core定位器。只有一个唯一实现的子类CorePropertiesLocator,先看这个接口,CorePropertiesLocator里面超多方法都有CoreDescriptor,所以需要CoreDescriptor的前置知识
Solr核心描述符,描述一个core,看它的私有属性就是用来描述Core的,并接受参数对core进行初始化,支持通过不同方式初始化core
可以看到这些值,是从现成的配置文件中来进行值的读取初始化,
回头在看CoreLocator,提供了如下方法
creat:创建一个core
persist:core的持久化,服务重启后core仍能够被找到
delete:删除core
rename:core的重命名
swap:交换两个core
discover:从持久性存储中加载所有CoreDescriptor(也就是core)
映入眼帘的 就是:
public static final String PROPERTIES_FILENAME = "core.properties";
回忆一下core.properties配置文件的作用:代表一个核心,保存了core的基本配置。里面支持配置core。大概长这个样子
CorePropertiesLocator除了实现了CoresLocator的几个方法外,增加了writePropertiesFiles、buildCoreDescriptor、buildCoreProperties、createName
buildCoreDescriptor:获取CoreDescriptor ,也就是core的信息
writePropertiesFiles:讲core的基本信息写到coreDiscoveryRoot中,默认为C:\Solr\solr-6.4.0\server\solr
buildCoreDescriptor:加载core,并返回build好的core为CoreDescriptor对象
其实分析到这里,讲我们不认识的类都看了一遍,CoreContainer的构造方法也差不都就看完了
其实只不过是this this的一层层调用
初始化身份认证插件,关于Solr的身份认证另起一篇文章。
创建一个新的CoreContainer并加载其core,其中代码很简单,loader就是SolrResourceLoader,solrHome,SolrXmlConfig加载配置去加载core,但是solr启动时并没有调用到这个方法。
将core加载到CoreContainer.这里仔细跟一下流程
首先时libDir下的资源文件的加载
然后初始化metricManager,Solr报告度量标准,这里略。
然后进行shardHandlerFactory的初始化,shardHandlerFactory在solr.xml文件中有配置,用于处理创建自定义分片处理程序。
然后是zk初始化
然后是admin系列的Handler的初始化
然后读取core放进SolrCores中
readVersion 获取版本
checkForDuplicateCoreNames 检查core名称是否重复
还有一些生命周期相关的 star shutdown等
一个存放cores的...类,感觉跟Corecontainer好像,应该算是Corecontainer中真正存放core的地方。