天天看點

Solr初始化源碼分析-Solr初始化與啟動

 用solr做項目已經有一年有餘,但都是使用層面,隻是利用solr現有機制,修改參數,然後監控調優,從沒有對solr進行源碼級别的研究。但是,最近手頭的一個項目,讓我感覺必須把solrn内部原理和擴充機制弄熟,才能把這個項目做好。今天分享的就是:Solr是如何啟動并且初始化的。大家知道,部署solr時,分兩部分:一、solr的配置檔案。二、solr相關的程式、插件、依賴lucene相關的jar包、日志方面的jar。是以,在研究solr也可以順着這個思路:加載配置檔案、初始化各個core、初始化各個core中的requesthandler...

  研究solr的啟動,首先從solr war程式的web.xml分析開始,下面是solr的web.xml片段:

  SolrDispatchFilter 是繼承BaseSolrFilter的一個Filter(Filter的作用是啥,大家應該清楚吧,一般web架構級别的産品源碼分析都是從filter或者servlet開始)。在介紹SolrDispatchFilter之前,先介紹一下BaseSolrFilter(也許程式員都有刨根問底的習慣)。BaseSolrFilter,是一個實作Filter接口的抽象類,功能很簡單,就是判斷目前程式是否已經加載日志方面的jar。代碼片段如下:

  

  着于篇幅,我就不介紹CheckLoggingConfiguration.check() 這裡面的東東了。OK,我們回到SolrDispatchFilter上。由于BaseSolrFilter是一個抽象類,所有作為非抽象類的SolrDispatchFilter必須要實作Filter接口。Filter接口如下:

  根據上面的注釋,我們知道在init方法中是進行初始化的。是以,今天咱們研究SolrDispatchFilter是如何初始化,是離不開這個方法的。接下來,咱們看看SolrDispatchFilter的init方法吧:

  咱們順藤摸瓜,來看看createCoreContainer這個方法到底幹了些什麼。

  createCoreContainer這個方法是決定咱們今天能否弄懂Solr初始化和啟動的關鍵。我們順便簡單分析一下這個方法中用到的幾個類和方法:

  SolrResourceLoader  類如其名,是solr資源加載器。

     ConfigSolr 是通過SolrResourceLoader來讀取solr配置檔案的中資訊的。

    loadConfigSolr,加載配置資訊的方法:

  CoreContainer  就是進行Core初始化工作的。我們主要看看load方法吧,這段方法有點長,代碼如下:

  在這段代碼,關鍵部分我都做了注釋。當你需要優化你的solr啟動速度時,你還會來研究這段代碼。下面,我們将研究solr的請求過濾處理的部分,我們需要關注doFilter那個方法了(關鍵部分我作以注釋,就不細講了):