Solr5.0源码分析-SolrDispatchFilter
年初,公司开发法律行业的搜索引擎。当时,我作为整个系统的核心成员,选择solr,并在solr根据我们的要求做了相应的二次开发。但是,对solr的还没有进行认真仔细的研究。最近,事情比较清闲,翻翻solr的源码,加深对solr的认识。在博客园上看到Ryan的Solr4.8.0源码分析(http://www.cnblogs.com/rcfeng/),跟着前人的脚步学习一下,并把5.0版本改动后的源码做一点补充。有什么不妥的地方,请Ryan谅解,或者联系我 QQ:503172601
5.0相对于4.8版本,扩充了cloud的功能。我们以tomcat容器为例,先看SolrDispatchFilter的实现。
- SolrDispatchFilter的实现
BaseSolrFilter实现了Filter接口。
- abstract class BaseSolrFilter implements Filter {
- static {
- CheckLoggingConfiguration.check();
- }
- }
再看CheckLoggingConfiguration代码,主要是进行SLF4j logging jars校验,很简单没啥可说的。
- final class CheckLoggingConfiguration {
- static void check() {
- try {
- LoggerFactory.getLogger(CheckLoggingConfiguration.class);
- } catch (NoClassDefFoundError e) {
- throw new NoClassDefFoundError("Failed to initialize Apache Solr: "
- +"Could not find necessary SLF4j logging jars. If using Jetty, the SLF4j logging jars need to go in "
- +"the jetty lib/ext directory. For other containers, the corresponding directory should be used. "
- +"For more information, see: http://wiki.apache.org/solr/SolrLogging");
- }
- }
- private CheckLoggingConfiguration() {}
- }
SolrDispatchFilter继承BaseSolrFilter,并且solr要求所有solr filter不要直接实现Filter接口,都要通过继承BaseSolrFilter。SolrDispatchFilter重写了三个方法:init,dofilter,destory。其中init和destory分别在tomcat的启动和关闭时候运行;doFilter处理用户的http请求像select查询等,放到后面来说。
2. Solr的启动
tomcat的启动的时候,会运行init方法,我们先来看看init方法
- public void init(FilterConfig config) throws ServletException
- {
- try {
- // web.xml configuration
- this.pathPrefix = config.getInitParameter( "path-prefix" );
- Properties extraProperties = (Properties) config.getServletContext().getAttribute(PROPERTIES_ATTRIBUTE);
- if (extraProperties == null)
- extraProperties = new Properties();
- String solrHome = (String) config.getServletContext().getAttribute(SOLRHOME_ATTRIBUTE);
- if (solrHome == null)
- solrHome = SolrResourceLoader.locateSolrHome();
- this.cores = createCoreContainer(solrHome, extraProperties);
- log.info("user.dir=" + System.getProperty("user.dir"));
- }
- catch( Throwable t ) {
- // catch this so our filter still works
- log.error( "Could not start Solr. Check solr/home property and the logs");
- SolrCore.log( t );
- if (t instanceof Error) {
- throw (Error) t;
- }
- }
- log.info("SolrDispatchFilter.init() done");
- }
我们看到,先从web.xml读取path-prefix的属性值;
(1)然后获取solrhome。
在SolrResourceLoader.locateSolrHome()方法里通过三种方式获取solrhome
- JNDI: via java:comp/env/solr/home
- The system property solr.solr.home
- Look in the current working directory for a solr/ directory
(2)然后调用createCoreContainer来实现Solr的初始化。
- protected CoreContainer createCoreContainer(String solrHome, Properties extraProperties) {
- NodeConfig nodeConfig = loadNodeConfig(solrHome, extraProperties);
- cores = new CoreContainer(nodeConfig, extraProperties);
- cores.load();
- return cores;
- }
(3) 类加载器SolrResourceLoader
solr的初始化主要是loadNodeConfig方法。我们来看loadNodeConfig方法做了什么?
创建SolrResourceLoader,代码如下:
- public SolrResourceLoader( String instanceDir, ClassLoader parent, Properties coreProperties )
- {
- if( instanceDir == null ) {
- this.instanceDir = SolrResourceLoader.locateSolrHome();
- log.info("new SolrResourceLoader for deduced Solr Home: '{}'",
- this.instanceDir);
- } else{
- this.instanceDir = normalizeDir(instanceDir);
- log.info("new SolrResourceLoader for directory: '{}'",
- this.instanceDir);
- }
- this.classLoader = createClassLoader(null, parent);
- addToClassLoader("./lib/", null, true);
- reloadLuceneSPI();
- this.coreProperties = coreProperties;
- }
SolrResourceLoader主要是做了3个事情
创建类装载器,加载lib目录下的类,装在LuceneSPI。
然后
(4)解析solr.xml文件
解析solr.xml文件,通过sorl.xml的地方从本地或者zookeeper的获取solr.xml文件。
然后调用SolrXmlConfig.fromSolrHome和SolrXmlConfig.fromInputStream解析solr.xml文件封装为NodeConfig。
(5)实例化一个CoreContainer,通过CoreContainer来加载cores
Solr5.0源码分析-SolrDispatchFilter的更多相关文章
- Solr4.8.0源码分析(25)之SolrCloud的Split流程
Solr4.8.0源码分析(25)之SolrCloud的Split流程(一) 题记:昨天有位网友问我SolrCloud的split的机制是如何的,这个还真不知道,所以今天抽空去看了Split的原理,大 ...
- AFNetWorking3.0源码分析
分析: AFNetWorking(3.0)源码分析(一)——基本框架 AFNetworking源码解析 AFNetworking2.0源码解析<一> end
- Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)
Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...
- Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四)
Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四) 题记:本来计划的SolrCloud的Recovery策略的文章是3篇的,但是没想到Recovery的内容蛮多的,前面 ...
- Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三)
Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及P ...
- Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二)
Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二) 题记: 前文<Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)>中提 ...
- Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)
Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一) 题记: 我们在使用SolrCloud中会经常发现会有备份的shard出现状态Recoverying,这就表明Solr ...
- Solr4.8.0源码分析(14)之SolrCloud索引深入(1)
Solr4.8.0源码分析(14) 之 SolrCloud索引深入(1) 上一章节<Solr In Action 笔记(4) 之 SolrCloud分布式索引基础>简要学习了SolrClo ...
- Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2)
Solr4.8.0源码分析(15) 之 SolrCloud索引深入(2) 上一节主要介绍了SolrCloud分布式索引的整体流程图以及索引链的实现,那么本节开始将分别介绍三个索引过程即LogUpdat ...
随机推荐
- ASP.NET跨服务器上传文件的相关解决方案
第一种:通过FTP来上传文件 首先,在另外一台服务器上设置好FTP服务,并创建好允许上传的用户和密码,然后,在ASP.NET里就可以直接将文件上传到这台 FTP 服务器上了.代码如下: <%@ ...
- Jquery对象,DOM对象
jquery对象就是通过Jquery包装Dom对象后产生的对象,Dom对象想要通过jquery进行操作,先转换为jquery对象: dom对象转化为jquery对象,使用$(dom对象): jquer ...
- 三分 --- POJ 3301 Texas Trip
Texas Trip Problem's Link: http://poj.org/problem?id=3301 Mean: 给定n(n <= 30)个点,求出包含这些点的面积最小的正方形 ...
- How to remove replication in SyteLine V2
以前曾经写了一篇<How to remove replication in Syteline>http://www.cnblogs.com/insus/archive/2011/12/20 ...
- C#中this的 四种 用法
C#中的this用法,相信大家应该有用过,但你用过几种?以下是个人总结的this几种用法,欢迎大家拍砖,废话少说,直接列出用法及相关代码. this用法1:限定被相似的名称隐藏的成员 /// < ...
- 第一个Object-C类
转自:http://www.cnblogs.com/heyonggang/p/3441051.html 来源:http://www.cnblogs.com/mjios/archive/2013/04/ ...
- 【jQuery基础学习】12 jQuery学习感想
学习完<锋利的jQuery>,用时13天. 这期间,私底下又用了一点时间去W3C上把HTML和CSS重新过了一遍. 总的来说,收获还是蛮多的. 其实在本书里面真正重要的也就前几章,后面的都 ...
- Json Utils
import java.util.List;import java.util.Map; import net.sf.json.JSONArray;import net.sf.json.JSONObje ...
- ahjesus配置vsftpd和xinetd
vsftpd的简单配置参考此教程 传送门 教程内xinetd的配置失效, 用xinetd方式启动ftp方式如下 1.在/etc/xinetd.d/目录中创建一个文件vsftpd 内容如下: servi ...
- eclipse easyexplorer openexplorer
电脑重装了.. eclipse换成了4.4.2,发现原来的easyexplorer不生效了(原来是4.2),搜了下,换成了open explorer即可. 方式一样,都是丢到eclipse/plugi ...