玩转Solr源码之(二)Solr源码Debug

玩转Solr源码之—Solr源码Debug

这篇文章是玩转Solr源码系列的第二篇,紧接着上一篇的源码导入,如果你还对如何将Solr源码导入到IDE还不了解的话,建议先看源码导入的部分。

定位源码入口

Solr 的源码入口为org.apache.solr.client.solrj.StartSolrJetty,主方法也比较简短,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  public static void main( String[] args ) 
{
//System.setProperty("solr.solr.home", "../../../example/solr");

Server server = new Server();
ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory());
// Set some timeout options to make debugging easier.
connector.setIdleTimeout(1000 * 60 * 60);
connector.setSoLingerTime(-1);
connector.setPort(8983);
server.setConnectors(new Connector[] { connector });

WebAppContext bb = new WebAppContext();
bb.setServer(server);
bb.setContextPath("/solr");
bb.setWar("webapp/web");

// // START JMX SERVER
// if( true ) {
// MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
// MBeanContainer mBeanContainer = new MBeanContainer(mBeanServer);
// server.getContainer().addEventListener(mBeanContainer);
// mBeanContainer.start();
// }

server.setHandler(bb);

try {
System.out.println(">>> STARTING EMBEDDED JETTY SERVER, PRESS ANY KEY TO STOP");
server.start();
while (System.in.available() == 0) {
Thread.sleep(5000);
}
server.stop();
server.join();
}
catch (Exception e) {
e.printStackTrace();
System.exit(100);
}
}

配置Solr Home

为了能够进行源码的bug,我们需要配置好solr_home,这里我们可以直接使用官方的Solr发行包中的example来做演示(真实的开发中,一般会有自己定义好的solr_home),直接下载solr的发行包(这里以solr-7.7.2为例子)

1
2
3
4
5
6
cd ~/Documents
curl "http://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/7.7.2/solr-7.7.2.tgz" -o solr-7.7.2.tgz && tar -xvf solr-7.7.2.tgz
mkdir solr_home && cd solr_home
cp ~/Documents/solr-7.7.2/server/solr/solr.xml ./
cp -r ~/Documents/solr-7.7.2/server/solr/configsets/sample_techproducts_configs ./
echo "collection=TEST" > sample_techproducts_configs/core.properties

这里简单解释下最后一个命令(echo “collection=TEST …”)的含义,Solr中有collection和core的概念。

  • Collection
    Solr中的collection由一个或者多个core组成,一个collection对应一份独立的config,在单节点的模式下,core和collection是等价的,在集群模式下,一个collection会有多个分片(shard)组成,每个分片又可以又多个副本(replica),每个shard对应一个core
  • core
    Solr中的core是一个包含index和config的运行实例

    配置StartSolrJetty

    solr中的solr_home 可以通过通过环境变量进行设置,直接上代码
    1
    System.setProperty("solr.solr.home", "/home/fql/Documents/solr_home");

还有一个地方需要改动,否则程序无法正常启动,直接上代码

1
bb.setWar("webapp/web"); ==> bb.setWar("solr/webapp/web");

设置完毕之后就可以启动StartSolrJetty后直接在浏览器中输入http://127.0.0.1:8983/solr就可以开始畅游solr的源码啦.![本地访问](https://s2.ax1x.com/2019/10/02/udq8Tx.png)

小技巧

StartSolrJetty默认的配置是没有太多的日志输出的,但是既然我们都已经开始debug solr的源代码了,还是输出更多的日志帮助我们更好的分析源码吧,同样,开启debug日志的代码也比较简单

1
System.setProperty("log4j2.debug","true");

这样我们就剋有看到所有的日志啦。下一篇我们将要介绍如果将修改过的solr源码部署到公司或者个人的nexus仓库,也是本系列的最后一篇。