菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。
Solr,着实是一个webapp,参考网上的文章,我们去看web.xml,查看到 SolrDispatchFilter类,该类的注释:此过滤器查看传入的URL,将其映射到solrconfig.xml中界说的处置程序。既然已经传入URL了,那就是已经启动完成了呗,以是我们要看的并不是这之后的代码,而是之前的启动历程。
Solr着实是一个webapp,Apache官方给出的安装包(http://archive.apache.org/dist/lucene/solr/ )内置了一个jetty容器,这里给出启动历程的调试参数下令:
java -Xdebug -Xrunjdwp:transport=dt_socket,address=10010,server=y,suspend=y -jar start.jar --module=http
再下载Solr的源码设置idea的Remote,即可更先调试。
更先之前,先来领会一下jetty,它是一个sevlet容器,http的客户端,感受和tomcat差其余是它自己可以以嵌入性的方式集成到自己的应用,用jetty就相当于把http服务塞进了自己的应用,而Solr就是这么做的。以是,我们要明晰Solr的启动历程,需要先去看看jetty的启动历程。
一、Jetty
参考毗邻:https://mp.weixin.qq.com/s/OQ24UmRHjoQObs_gpjJ7Ww
重点关注WebAppContext,先来看下WebAppContext主要做了什么,主要的初始化事情是两个方面:
- war包的解压为其确立事情目录并将其中WEB-INF下的classes文件和依赖jar包加入到classpath中,还需要为应用确立一个ClassLoader。
- 将治理的SessionHandler、SecurityHandler、ServletHandler和WebAppContext构建成一个Handler链,用来处置请求,再将请求交给其它链中的其它节点处置之前,还需要对请求举行url和目的主机的校验,若是校验不通过则直接返回。
主要的启动逻辑和资源加载逻辑都放在doStart()方式里,以是从dostart()方式更先剖析Solr的启动历程。
1.首先进入doStart()的preConfigure()方式
可以看到当前额context已经是solr-webapp了
这里加载了solr-home/server/lib/ 目录下的jars 以及file:///C:/Solr/solr-6.4.0/server/solr-webapp/webapp/WEB-INF/lib/ 下的jars
2.挪用父类ServlerContextHandler的super.doStart()
然后挪用了父类ServlerContextHandler的doStart()方式
关于ServletContextHandler:
是ContextHandler的直接子类,具有ContextHandler的大部门特征,差其余地方是ServletContextHandler中治理了三个Handler:ServletHandler、SessionHandler、SecurityHandler.
3.再进入父类ContextHandler的doStart() 方式
它的doStart()方式直接走到了父类(ContextHandler)的doStart() 方式。
Contexthandler是Scopehandler的直接子类,从名字来看是上下文handler,在servlet中每个web应用都有一个上下文。ContextHandler实现了CycelLife和handler接口,重写了doStart() 方式,这里我们直接去看它的doStart()方式
4.再进入WebAppContext的startContext()
跟进startContext(),由于当前this工具为WebAppContext,以是会进入它的startContext
this.configure() 照样会走到WebInfConfigureation的加载jars逻辑中,resolve 剖析元数据,跟进去看了一下,是对一些jar包的处置,应该是加载jar包的操作。
,,菜宝钱包(www.caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。
我们直接关注startWebapp,跟进去
5.进入ServletContextHandler的startContext()
well会进入super的starContext,也就是ServletContextHandler,ServletContextHandler就是重写了父类的startContext()方式,将SessionHandler、SecurityHandler、ServletHandler组成一个Handler链来对请求举行处置,而且在startContext()方式中举行了ServletHandler的初始化(remember this)。
我们继续跟进父类的startContext方式。
6.进入ContextHandler的startContext()
挪用父类方式之前前两个步骤获取的都为null,继续跟进父类的方式
7.进入Scopedhandler的doStart() 方式
Scopedhandler主要是处置handler链,要害焦点在doScope方式中,这里doStart() 也是直接挪用了父类的doStart() 方式
8.进入AbstractHandler的dostart() 方式
AbstrachHandler是大部门handler都继续的父类,AbstractHandler并没有对父类要害方式doStart() doStop() 举行重写,也没有详细实现handler() 方式,唯一重写的就是setServer() 方式,以是还要继续往上跟。
9.进入ContainerLifeCycle的dostart() 方式
生命周期的治理,进入启动程序:这里会依次启动各个handler
10.this._servletHandler.initialize()
所有的handler(处置程序)都start起来了,再一层一层的返回去,回忆一下,在ServletContextHandler中有一个_servletHandler属性,它会有initalize()方式,这里就是我们的webapp(Solr)启动初始化,加载设置文件入口。
二、Solr
1.ServletHandler的initialize()
进入ServlerHandler的initialize()方式,动态调试的历程中查看一下它的各个属性再经由了一些列doStart(),startContext() 之后被初始化什么样了,看这样,Solr就是一个Webapp嘛~
这里我们重点关注一下this._filters,在读取web.xml中已经初始化(WebXmlConfiguration预加载剖析web.xml),这个filters很主要,我们查看web.xml 界说了这个filter。
2.SolrDispatchFilter的init()
Jetty中所有组件都是受LifeCycle治理,首先是启动这个SolrRequestFilter,f.start(),然后进入SolrRequestFilter的初始化方式FilterHolder.initialize(),这里先将FilterHolder转化成SolrDispatchFilter,增添它的Filter属性,贴一张SolrDispatchfilter的类图
转化完成后后新建Config工具,然后举行config的初始化
跟进SolrDispatchFilter的init()方式,注释中标明晰也许做了什么
3.SolrDispatchFilter的creatCoreContainer()
将creatCoreContainer单独拎出来,由于它算是整个init内里很焦点的方式,它的返回值初始化了this.cores,cores也就是CoreContainer,CoreContainer单独的剖析文章:
它就是盛放core的容器,使用creatCoreContianer方式举行初始化。跟进creatCoreContianer,首先是loadNodeConfig,返回一个NodeConfig工具,NodeConfig也在上面文章中有先容:每个私有属性都对应着solr.xml界说的字段,我们跟进loadNodeConfig方式
4.loadNodeConfig方式
行使SolrResourceLoader 加载solr.xml文件,然后再挪用SolrXmlConfig的fromSolrHome方式加载剖析loader中存储的solr.xml
此时的挪用栈(部门)
fromSolrHome:141, SolrXmlConfig (org.apache.solr.core)
loadNodeConfig:265, SolrDispatchFilter (org.apache.solr.servlet)
createCoreContainer:233, SolrDispatchFilter (org.apache.solr.servlet)
init:167, SolrDispatchFilter (org.apache.solr.servlet)
网友评论