Как перезагрузить файл свойств без перезагрузки Tomcat - PullRequest
2 голосов
/ 26 августа 2010

Я загружаю файл свойств из classpath по методу:

    String cheminFichier = new StringBuilder(100).append(classeBP.getPackage().getName().replace(".", "/")).append(File.separator).append(
        REPERTOIRE_MAPPING).append(nomFichier).append(".properties").toString();
    InputStream isMapping = Thread.currentThread().getContextClassLoader().getResourceAsStream(cheminFichier.toString());
    if (isMapping == null)
    {
        throw new ServiceMappingException("Erreur lors du chargement du mapping du service. Le fichier "
            + cheminFichier + " n'existe pas.");
    }
    else
    {
        Properties mapping = new Properties();
        try
        {
            mapping.load(isMapping);
        }
        catch (IOException e)
        ...
    }

Хорошо, это работа. Но если я изменю содержимое файла свойств во время работы Tomcat, изменения игнорируются. Он не перегружен как классы.

Мой контекст настроен с параметром reloadable="true", а загрузчик классов, возвращаемый Thread.currentThread (). GetContextClassLoader () - загрузчик классов WEBAPP (не системный загрузчик классов или другой).

Я прочитал, что можно использовать ServletContext.getResourceAsStream, но у меня нет доступа к контексту сервлета.

Это Tomcat 5.5.

Есть идеи? Если нет, есть ли у вас решение для принудительной перезагрузки определенного ресурса (мой файл свойств)?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 26 августа 2010

Вы можете использовать что-то вроде Конфигурация Commons , которая поддерживает автоматическая перезагрузка .

1 голос
/ 26 августа 2010

Вы все еще можете использовать Tomcat Manager для перезагрузки вашего приложения.

0 голосов
/ 26 августа 2010

На самом деле, ваше веб-приложение имеет доступ к ServletContext в различных точках. Например, вы можете получить его, используя ServletRequest.getServletContext() или ServletContextEvent, полученный с помощью обратного вызова ServletContextListener.


Это немного не по теме, но вы должны понимать, что этот код:

String cheminFichier = new StringBuilder(100).append(classeBP.getPackage().getName().replace(".", "/")).append(File.separator).append(
    REPERTOIRE_MAPPING).append(nomFichier).append(".properties").toString();

можно / нужно записать как:

String cheminFichier = classeBP.getPackage().getName().replace(".", "/")) +
    File.separator + REPERTOIRE_MAPPING + nomFichier + ".properties";

Нет никакого преимущества в производительности здесь в явном использовании здесь StringBuilder, потому что компилятор Java скомпилирует объединение в тот же код.

Вам нужно использовать StringBuilder, только если конкатенация включает цикл.

...