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 ...
 
随机推荐
- Django项目--web聊天室
			
需求 做一个web聊天室,主要练习前端ajax与后台的交互: 一对一聊天和群组聊天 添加用户为好友 搜索并添加群组 管理员可以审批用户加群请求,群管理员可以有多个,群管理员可以删除,添加禁言群友 与聊 ...
 - ASP.NET MVC5利用EF,反向自动生成数据库
			
1.在Model类里面,写好相应的属性. using System; using System.Collections.Generic; using System.Linq; using System ...
 - WPF学习之深入浅出话命令
			
WPF为我们准备了完善的命令系统,你可能会问:"有了路由事件为什么还需要命令系统呢?".事件的作用是发布.传播一些消息,消息传达到了接收者,事件的指令也就算完成了,至于如何响应事件 ...
 - Run python as a daemon process
			
I am using `&`: why isn't the process running in the background? No problem. We won't show y ...
 - 整合spring,springmvc和mybatis
			
我创建的是maven项目,使用到的依赖架包有下面这些: <dependencies> <dependency> <groupId>org.springframewo ...
 - javascript  indexOf  startWith
			
判断字符串是否以XX开头 1.切割转换 var str = "ababaa",tags = jquery.trim(str); 2. indexOf方法运行 !tags.i ...
 - 【Asphyre引擎】Asphyre时隔3年,更名为PXL,全平台支持!
			
ps:回忆日志 新版本10月初就推出了,我第一时间(10.2日更新,我当天就看到了)下载下来.发现部分Demo需要XE8才能编译通过,又去下载了一个XE8.折腾完已经深夜,只是粗粗的把Demo都编译了 ...
 - jquery 监控文本框键盘事件(回车事件),附常用keycode值。
			
$(function(){ $(".search").keydown(function(event) { ) { //执行操作 } }) ); 完整的 key press 过程分为 ...
 - swift学习笔记之-下标脚本
			
//下标脚本subscript import UIKit /*下标脚本(Subscripts) 下标脚本: 1.可以定义在类(Class).结构体(structure)和枚举(enumeration) ...
 - Android 带清除功能的输入框控件EditText
			
1.效果图 2.源码下载 http://download.csdn.net/detail/yanzi2015/8864603 3.相关博客 http://www.cnblogs.com/to ...