Solr4.9.0源码分析(1)之Solr的Servlet

Solr是作为一个Servlet运行在Tomcat里面的,可以查看Solr的web.xml。

1.web.xml配置

由web.xml可以看出,基本上所有Solr的操作都是在SolrDispatchFilter中实现的。当输入http://localhost:8080/solr/前缀的URL就会触发SolrDispatchFilter.

 1   <filter>
 2     <filter-name>SolrRequestFilter</filter-name>
 3     <filter-class>org.apache.solr.servlet.SolrDispatchFilter</filter-class>
 4     <init-param>
 5       <param-name>path-prefix</param-name>
 6       <param-value>/xxx</param-value>
 7     </init-param>
 8   </filter>
 9
10   <filter-mapping>
11     <filter-name>SolrRequestFilter</filter-name>
12     <url-pattern>/*</url-pattern>
13   </filter-mapping>
14   <servlet>
15     <servlet-name>RedirectOldAdminUI</servlet-name>
16     <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
17     <init-param>
18       <param-name>destination</param-name>
19       <param-value>${context}/#/</param-value>
20     </init-param>
21   </servlet>
22   <servlet-mapping>
23     <servlet-name>RedirectOldAdminUI</servlet-name>
24     <url-pattern>/admin/</url-pattern>
25   </servlet-mapping>

2. SolrDispatchFilter的实现

SolrDispatchFilter继承了Filter,实现主要分为三个接口:init,dofilter,destory。其中init和destory分别在tomcat的启动和关闭时候进行。

 1  /**
 2   *初始化,当tomcat启动时候开始初始化,其中主要调用createCoreContainer来实现Solr的初始化
 3   */
 4 public void init(FilterConfig config) throws ServletException
 5   {
 6     log.info("SolrDispatchFilter.init()");
 7
 8     try {
 9       // web.xml configuration
10       this.pathPrefix = config.getInitParameter( "path-prefix" );
11
12       this.cores = createCoreContainer();
13       log.info("user.dir=" + System.getProperty("user.dir"));
14     }
15     catch( Throwable t ) {
16       // catch this so our filter still works
17       log.error( "Could not start Solr. Check solr/home property and the logs");
18       SolrCore.log( t );
19       if (t instanceof Error) {
20         throw (Error) t;
21       }
22     }
23
24     log.info("SolrDispatchFilter.init() done");
25   }
26   /**
27    * filter接口的具体实现,这里主要实现了主要的Solr功能
28    */
29   @Override
30   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
31     doFilter(request, response, chain, false);
32   }
33
34   /**
35    * 关闭Solr
36    */
37   @Override
38   public void destroy() {
39     if (cores != null) {
40       cores.shutdown();
41       cores = null;
42     }
43   }
44 }

3.Servlet的实现

通过查看web.xml以及源码可以看到,虽然Solr继承并实现了Servlet接口,但是Solr的主要操作却是主要集中在dofilter里面。以RedictServlet为例,它主要实现了http的重定向功能。从web.xml配置中可以看到,当url为solr/admin时候就会重定向为solr/#/

 1 /**
 2  * A Simple redirection servlet to help us deprecate old UI elements
 3  */
 4 public class RedirectServlet extends BaseSolrServlet {
 5
 6   static final String CONTEXT_KEY = "${context}";
 7
 8   String destination;
 9   int code = HttpServletResponse.SC_MOVED_PERMANENTLY;
10
11   @Override
12   public void init(ServletConfig config) throws ServletException {
13     super.init(config);
14
15     destination = config.getInitParameter("destination");
16     if(destination==null) {
17       throw new ServletException("RedirectServlet missing destination configuration");
18     }
19     if( "false".equals(config.getInitParameter("permanent") )) {
20       code = HttpServletResponse.SC_MOVED_TEMPORARILY;
21     }
22         // 获取重定向的url 解析init-param 获取destination值
23     // Replace the context key
24     if(destination.startsWith(CONTEXT_KEY)) {
25       destination = config.getServletContext().getContextPath()
26           +destination.substring(CONTEXT_KEY.length());
27     }
28   }
29
30   @Override
31   public void doGet(HttpServletRequest req, HttpServletResponse res)
32           throws ServletException,IOException {
33
34     res.setStatus(code);
35     res.setHeader("Location", destination);
36   }
37
38 }

Solr4.9.0源码分析(1)之Solr的Servlet,布布扣,bubuko.com

时间: 2024-08-09 22:02:56

Solr4.9.0源码分析(1)之Solr的Servlet的相关文章

Solr4.8.0源码分析(7)之Solr SPI

Solr4.8.0源码分析(7)之Solr SPI 查看Solr源码时候会发现,每一个package都会由对应的resources. 如下图所示: 一时对这玩意好奇了,看了文档以后才发现,这个services就是java SPI机制.首先介绍下java SPI机制,然后再结合Solr谈一下SPI. 1. JAVA SPI 当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件.该文件里就是实现该服务接口的具体实现类.而

Solr4.9.0源码分析(2)之Solr的启动(一)

上文写到Solr的启动过程是在SolrDispatchFilter的init()里实现,当Tomcat启动时候会自动调用init(); Solr的启动主要在 this.cores = createCoreContainer();语句中实现. /** *初始化,当tomcat启动时候开始初始化,其中主要调用createCoreContainer来实现Solr的初始化 */ public void init(FilterConfig config) throws ServletException {

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三)

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及PeerSync策略.本文以及后续的文章将重点介绍Replication策略.Replication策略不但可以在SolrCloud中起到leader到replica的数据同步,也可以在用多个单独的Solr来实现主从同步.本文先介绍在SolrCloud的leader到replica的数据同步,下一篇

Solr4.8.0源码分析(10)之Lucene的索引文件(3)

Solr4.8.0源码分析(10)之Lucene的索引文件(3) 1. .si文件 .si文件存储了段的元数据,主要涉及SegmentInfoFormat.java和Segmentinfo.java这两个文件.由于本文介绍的Solr4.8.0,所以对应的是SegmentInfoFormat的子类Lucene46SegmentInfoFormat. 首先来看下.si文件的格式 头部(header) 版本(SegVersion) doc个数(SegSize) 是否符合文档格式(IsCompoundF

Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建

Solr4.8.0源码分析(4)之Eclipse Solr调试环境搭建 由于公司里的Solr调试都是用远程jpda进行的,但是家里只有一台电脑所以不能jpda进行调试,这是因为jpda的端口冲突.所以只能在Eclipse 搭建Solr的环境,折腾了一小时终于完成了. 1. JDPA远程调试 搭建换完成Solr环境后,对${TOMCAT_HOME}/bin/startup.sh 最后一行进行修改,如下所示: 1 set JPDA_ADDRESS=7070 2 exec "$PRGDIR"

Solr4.8.0源码分析(25)之SolrCloud的Split流程

Solr4.8.0源码分析(25)之SolrCloud的Split流程(一) 题记:昨天有位网友问我SolrCloud的split的机制是如何的,这个还真不知道,所以今天抽空去看了Split的原理,大致也了解split的原理了,所以也就有了这篇文章.本系列有两篇文章,第一篇为core split,第二篇为collection split. 1. 简介 这里首先需要介绍一个比较容易混淆的概念,其实Solr的HTTP API 和 SolrCloud的HTTP API是不一样,如果接受到的是Solr的

Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)

Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了.本文主要介绍Solr的主从同步复制.它与前文<Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三)>略有不同,前文讲到的是SolrCloud的leader与replica之间的同步,不需要通过配置solrconfig.xml来实现.而本文主要介绍单机模式下,利用so

Solr4.8.0源码分析(19)之缓存机制(二)

Solr4.8.0源码分析(19)之缓存机制(二) 前文<Solr4.8.0源码分析(18)之缓存机制(一)>介绍了Solr缓存的生命周期,重点介绍了Solr缓存的warn过程.本节将更深入的来介绍下Solr的四种缓存类型,以及两种SolrCache接口实现类. 1.SolrCache接口实现类 前文已经提到SolrCache有两种接口实现类:solr.search.LRUCache 和 solr.search.LRUCache. 那么两者具体有啥区别呢? 1.1 solr.search.LR

Solr4.8.0源码分析(17)之SolrCloud索引深入(4)

Solr4.8.0源码分析(17)之SolrCloud索引深入(4) 前面几节以add为例已经介绍了solrcloud索引链建索引的三步过程,delete以及deletebyquery跟add过程大同小异,这里暂时就不介绍了.由于commit流程较为特殊,那么本节主要简要介绍下commit的流程. 1. SolrCloud的commit流程 SolrCloud的commit流程同样分为三步,本节主要简单介绍下三步过程. 1.1 LogUpdateProcessor LogUpdateProces