LINUX.ORG.RU
ФорумAdmin

tomcat 9. Не могу разобраться с контекстами

 ,


0

2

Здравствуйте. имею сервер приложений tomcat 9. Есть задача: развернуть в томкате 2 экземпляра одного и того же приложения, но с разным содержимым конфиг-файлов этого приложения.

прочел в документации по Tomcat, что можно преднастроить контекст для каждого экземпляра с отдельным набором параметров. Сделал следующее: 1.кладу приложение ibso.war в $CATALINA_HOME/webapp 2.создаю файл $CATALINA_HOME/conf/Catalina/localhost/ibso.xml файл с содержимым:

<Context>
<!--  <Environment name="JAVA_OPTS" value="-Xmx512 -Dibso.container.settings=/home/appadmin/cft-as/apache-tomcat-9.0.70/webapps/ibso/settings.xml -Dlog4j2.configurationFile=/home/appadmin/cft-as/apache-tomcat-9.0.70/webapps/ibso/log4j2.properties" type="java.lang.String" override="false" /> -->
<!-- <Parameter name="settings" value="/home/appadmin/cft-as/apache-tomcat-9.0.70/webapps/ibso/settings.xml"/>
      <Parameter name="log4g.configurationFile" value="/home/appadmin/cft-as/apache-tomcat-9.0.70/webapps/ibso/log4j2.properties"/>  -->
      <Parameter name="ibso.container.settings" value="file:settings.xml"/>
      <Parameter name="log4g.configurationFile" value="log4j2.properties"/>
</Context>

При этом физически файлы я размещал как в /webapps/ibso/ так и в $CATALINA_HOME/conf/.

Однако, приложение файл settings.xml не подхватывает.

В качестве стандартного решения, разработчик рекомендует указывать этот файл через

CATALINA_OPTS="-Dibso.container.settings=/full/path/fo/file"

Но этот вариант не подходит в случае, если в одном томкате нужно запустить 2 эксземпляра с разной конфигурацией.

Предполагаю, что не правильно обращаюсь к файлу через JNDI, но не понимаю как не правильно. Пробовал разные варианты (см.закомментированные фрагменты). Пожалуйста подскажите кто вкурсе.



Последнее исправление: dm_wolfy (всего исправлений: 2)

https://tomcat.apache.org/tomcat-9.0-doc/config/context.html

«The Context element represents a web application, which is run within a particular virtual host.»

«In individual files (with a «.xml» extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory. The context path and version will be derived from the base name of the file (the file name less the .xml extension).»

«CATALINA_BASE» != CATALINA_HOME".

приложение файл settings.xml не подхватывает.

было ibso.xml

откуда взялось settings.xml ?

<Parameter name="ibso.container.settings" value="file:settings.xml"/>

Эту строчку я просто не понял.

Должен, наверное, быть способ узнать/задебужить, как именно стартовало приложение (какие параметры ему передал контейнер).

Не само же приложение конфиг контейнера читает?

Shushundr ★★★★
()
Последнее исправление: Shushundr (всего исправлений: 5)
Ответ на: комментарий от Shushundr

«Значения свойств, определенных в файле контекста my-context-name.xml, используются как сервером Tomcat, так и самим приложением»

«Сервер Tomcat может использовать эти свойства для определения параметров подключения к базе данных или для настройки ресурсов, таких как пути к файлам или параметры сессии»

«Приложение может получить доступ к свойствам из файла контекста приложения через API ServletContext.getInitParameter(), что позволяет приложению динамически изменять свое поведение в зависимости от конфигурации, определенной в файле контекста. Это может быть полезно, например, для переключения между различными средами (разработка, тестирование, продакшн) без необходимости изменения кода приложения.»

«Чтобы отладить и увидеть, какие значения считываются через ServletContext.getInitParameter, вы можете добавить логирование или печать значений в консоль в методе init() вашего сервлета. Это позволит вам увидеть, какие параметры инициализации доступны и какие значения они имеют в момент инициализации.»

public class MyServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        super.init();

        // Получение контекста сервлета
        ServletContext context = getServletContext();

        // Получение всех имен параметров инициализации
        Enumeration<String> initParamNames = context.getInitParameterNames();

        // Вывод всех параметров инициализации и их значений
        while (initParamNames.hasMoreElements()) {
            String paramName = initParamNames.nextElement();
            String paramValue = context.getInitParameter(paramName);
            System.out.println("Имя параметра: " + paramName + ", Значение: " + paramValue);
        }
    }
}

«параметры инициализации считываются только один раз при инициализации контекста приложения и не будут обновляться до перезапуска сервлета или переинициализации контекста приложения, если вы не реализуете механизм для динамической перезагрузки конфигурации»

Я так думаю, что надо написать тестовое приложение, задеплоить его в два разных контекста и увидеть разницу в настройках по логам.

«В контексте веб-приложения, работающего на сервере Tomcat, стандартный поток вывода обычно перенаправляется в файл лога сервера.»

Shushundr ★★★★
()
Последнее исправление: Shushundr (всего исправлений: 3)