Я установил две версии solr на Tomcat 6, 1.3 и 4.7, каждый из которых доступен, но на вкладке конфигурации tomcat Java -Dsolr.solr.home=C:\Solr\solr
где этот путь - путь 1.3., У меня есть 4.7 на E:\new-solr.
Когда я пытаюсь создать новое ядро, оно создалось хорошо, но оно исчезло после перезапуска Tomcat. Я верю, что причиной отсутствия правильного дома Solr является причина. Итак, есть ли способ установить несколько свойств solr в свойствах Java Tomcat?
Edit: Когда я запускаю Tomcat с
-Dsolr.solr.home=C:\Solr\solr
У меня есть ошибки в отношении недостающих ядер в версии Solr 4.7, где эти ядра отлично работают в Solr 1.3.Архив ошибок инициализации SolrCore: org.apache.solr.common.SolrException: org.apache.solr.common.SolrException: не удалось загрузить файл конфигурации c:\solr\solr\archive\solrconfig.xml
Solr SolrResourceLoader#locateSolrHome
сначала пытается JNDI, а затем свойства системы, чтобы найти его настройки. Поскольку свойства системы -D
разделяются между всеми приложениями в одном экземпляре Tomcat, они не могут использоваться для настройки нескольких экземпляров Solr.
Если по какой-то причине нельзя использовать JNDI (например, <Environment name="solr/home"...>
в файлах XML) или один экземпляр с несколькими ядрами, тогда можно было бы включить Solr WAR в одно собственное приложение и использовать Слушатель контекста сервлета (временно) изменяет свойства системы при запуске.
Это, безусловно, взломать, и полагается на Tomcat, не запуская приложения параллельно, а на Solr только чтение свойств системы при запуске. Я тестировал это, чтобы работать хорошо, но все же он, вероятно, подходит только для тестирования.
Опять же, это в первую очередь нуждается в одном, чтобы обернуть Solr в одно приложение. Затем создайте папку /some/config
с подпапкой для каждого экземпляра, соответствующей ее имени контекста. В каждой custom.properties
файл custom.properties
:
# This file /some/config/[servlet-context-name]/custom.properties is used
# if Tomcat is started with:
# -Dcustom.config.dir=/some/config
# ...and then (temporarily) overwrites any system properties specified below:
solr.solr.home=/some/other/folder/conf
solr.data.dir=/some/other/folder/data
Чтобы объединить свойства системы на основе некоторых значений ключа в файле свойств:
/**
* Tries to find the given file and merges its properties into the existing
* system properties.
*
* @param configFile
* full path of a property file
* @return {@code true} if the file was found and merged; {@code false}
* otherwise
*/
private boolean mergeSystemProperties(final String configFile) {
try (final FileInputStream is = new FileInputStream(configFile)) {
final Properties custom = new Properties();
custom.load(is);
for (final Map.Entry<Object, Object> prop : custom.entrySet()) {
LOG.info("Setting {}={}", prop.getKey(), prop.getValue());
System.setProperty((String)prop.getKey(), (String)prop.getValue());
}
return true;
} catch (final FileNotFoundException e) {
LOG.info("Could not find custom properties: {}", configFile);
} catch (final IOException e) {
LOG.error("Failed to read custom properties: " + configFile, e);
}
return false;
}
Это можно использовать в прослушивателе:
public class TestConfigContextListener implements ServletContextListener {
private static final Logger LOG = ...
private static final String PROP_DIR = "custom.config.dir";
private static final String FILE_NAME = "custom.properties";
@Override
public void contextInitialized(final ServletContextEvent event) {
final String configDir = System.getProperty(PROP_DIR);
if (configDir == null) {
LOG.info("No value for -D{}; not reading custom config", PROP_DIR);
} else {
LOG.info("Custom config dir: -D{}={}", PROP_DIR, configDir);
final ServletContext context = event.getServletContext();
// Either "" for the root, or "/some-path" otherwise
final String contextPath = context.getContextPath();
if (!contextPath.isEmpty()) {
if (mergeSystemProperties(configDir + File.separator
+ contextPath.substring(1, contextPath.length())
+ File.separator + FILE_NAME)) {
// We found the configuration in a subfolder matching the
// specific contextPath; done.
return;
}
}
// Root context, or no configuration in a subfolder matching the
// specific contextPath; try to load from configDir itself:
mergeSystemProperties(configDir + File.separator + FILE_NAME);
}
}
...
}
... с помощью web.xml
:
<!--
Tries to read a property file to set/override system properties just before
Solr is initialized, sort of allowing to run multiple instances with
different settings, IF THEY ARE NOT STARTED SIMULTANEOUSLY.
-->
<listener>
<listener-class>net.example.TestConfigContextListener</listener-class>
</listener>
Заключительные примечания: хотя можно использовать <env-entry>
в web.xml
для "поддельных" записей JNDI, используя ServletContext#setInitParameter
для изменения тех, которые присутствуют в прослушивателе контекста, не имеет никакого эффекта. Кроме того, JNDI-контекст java:comp/env
доступен только для чтения, поэтому его нельзя изменить из кода. Поэтому действительно нужно вернуться к (временному) настройке свойств системы.
Похоже, вы передаете значение solr home с помощью JAVA_OPTS
. Вам нужно отредактировать server.xml
и добавить соответствующий контент Solr в Context
. Следующий пример представлен на странице SolrTomcat на вики Solr.
<Context docBase="/opt/solr/example/solr/solr.war" debug="0" crossContext="true">
<Environment name="solr/home" type="java.lang.String" value="/opt/solr/example/solr" override="true"/>
</Context>