Entrance
SolrDispatchFilter.init
new CoreContainer.Initialize().initialize();
CoreContainer.Initialize.initialize()
1. SolrResourceLoader.locateSolrHome()
The order to find Solr Home: jndi lookup: java:comp/env/solr/home, system environment: solr.solr.home, otherwise solr/, relative to current directory.
2. new CoreContainer(solrHome).load(solrHome, solr.xml)
This will create add jars in solr-home/lib to class loader, parse solr.xml, use ThreadPoolExecutor and CompletionService to load cores defined in parallel, define a CoreDescriptor for each core, in CoreDescriptor, we can see the default value for core properties: loadOnStartup=true, isTransient = false.
CompletionService completionService = new ExecutorCompletionService(
coreLoadExecutor);
Set> pending = new HashSet>();
pending.add(completionService.submit(task));
In the Callable task, it will call CoreContainer.createFromLocal(String, CoreDescriptor).
CoreContainer.createFromLocal
1. Create SolrConfig which represents solrconfig.xml, this will read the xml, load the jars into classloader, create SolrIndexConfig for indexConfig section, create CacheConfig, HttpCachingConfig, load requestHandler, queryParser, transformer etc.
2. Creat IndexSchema which represents schema.xml, this will parse schema,xml. create field types, SchemaField, read SimilarityFactory.
3. Create one SolrCore: core = new SolrCore(dcore.getName(), null, config, schema, dcore);
This will initialize listeners defined in solrconfig.xml, initIndex, initQParsers, initValueSourceParsers, initTransformerFactories. It will initialize RequestHandlers, create one instance for each request handler defined, and put it into a map. So there will be only one instance for each request handleRequestBody. So be careful of the thread safty when write our own request handler.
reqHandlers = new RequestHandlers(this);
reqHandlers.initHandlersFromConfig(solrConfig);
Class in IndexSchema: DynamicField, DynamicCopy
CoreContainer.cfg represents solr.xml:, in CoreContainer, you can find out all available configuration in solr.xml.
Example: String dcoreName = cfg.get("solr/cores/@defaultCoreName", null);
SolrCore.SolrCore(String, String, SolrConfig, IndexSchema, CoreDescriptor, UpdateHandler, SolrCore)
reqHandlers = new RequestHandlers(this);
reqHandlers.initHandlersFromConfig(solrConfig);
SolrResourceLoader
Add solr-home/lib jars to class loader.
this.classLoader = createClassLoader(null, parent);
addToClassLoader("./lib/", null);
reloadLuceneSPI();
Learned
1. Add jars into class loader?
SolrResourceLoader.replaceClassLoader
2. CompletionService
SolrDispatchFilter.init
new CoreContainer.Initialize().initialize();
CoreContainer.Initialize.initialize()
1. SolrResourceLoader.locateSolrHome()
The order to find Solr Home: jndi lookup: java:comp/env/solr/home, system environment: solr.solr.home, otherwise solr/, relative to current directory.
2. new CoreContainer(solrHome).load(solrHome, solr.xml)
This will create add jars in solr-home/lib to class loader, parse solr.xml, use ThreadPoolExecutor and CompletionService to load cores defined in parallel, define a CoreDescriptor for each core, in CoreDescriptor, we can see the default value for core properties: loadOnStartup=true, isTransient = false.
CompletionService
coreLoadExecutor);
Set
pending.add(completionService.submit(task));
In the Callable task, it will call CoreContainer.createFromLocal(String, CoreDescriptor).
CoreContainer.createFromLocal
1. Create SolrConfig which represents solrconfig.xml, this will read the xml, load the jars into classloader, create SolrIndexConfig for indexConfig section, create CacheConfig, HttpCachingConfig, load requestHandler, queryParser, transformer etc.
2. Creat IndexSchema which represents schema.xml, this will parse schema,xml. create field types, SchemaField, read SimilarityFactory.
3. Create one SolrCore: core = new SolrCore(dcore.getName(), null, config, schema, dcore);
This will initialize listeners defined in solrconfig.xml, initIndex, initQParsers, initValueSourceParsers, initTransformerFactories. It will initialize RequestHandlers, create one instance for each request handler defined, and put it into a map. So there will be only one instance for each request handleRequestBody. So be careful of the thread safty when write our own request handler.
reqHandlers = new RequestHandlers(this);
reqHandlers.initHandlersFromConfig(solrConfig);
Class in IndexSchema: DynamicField, DynamicCopy
CoreContainer.cfg represents solr.xml:, in CoreContainer, you can find out all available configuration in solr.xml.
Example: String dcoreName = cfg.get("solr/cores/@defaultCoreName", null);
SolrCore.SolrCore(String, String, SolrConfig, IndexSchema, CoreDescriptor, UpdateHandler, SolrCore)
reqHandlers = new RequestHandlers(this);
reqHandlers.initHandlersFromConfig(solrConfig);
SolrResourceLoader
Add solr-home/lib jars to class loader.
this.classLoader = createClassLoader(null, parent);
addToClassLoader("./lib/", null);
reloadLuceneSPI();
Learned
1. Add jars into class loader?
SolrResourceLoader.replaceClassLoader
2. CompletionService