две версии solr на tomcat

1

Я установил две версии 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

  • 0
    Я так не думаю, Solr это веб-приложение, вам нужно запустить их на разных портах, вероятно. Не могли бы вы показать свой web.xml в tomcat?
  • 0
    @Mysterion В web.xml моего Tomcat нет никакого отношения к обеим версиям Solr.
Теги:
tomcat
solr

2 ответа

1

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 доступен только для чтения, поэтому его нельзя изменить из кода. Поэтому действительно нужно вернуться к (временному) настройке свойств системы.

1

Похоже, вы передаете значение 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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню