Есть ли способ применить порядок развертывания в tomcat6? - PullRequest
12 голосов
/ 14 июля 2011

У меня есть 3 войны в моей папке веб-приложения. Два из них построены на услугах третьего. Я нахожусь в тестовой среде, то есть у меня нет контроля над их архитектурами, поэтому я не могу ничего изменить. Итак ...

Вопрос : Есть ли способ применить порядок развертывания в tomcat?

Я столкнулся с одним вопросом здесь в stackoverflow, но нет решения.

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

Я уверен, что есть способ сделать это, настроив один из файлов tomcat conf .xml. Я просто не знаю, какой именно.

Ответы [ 7 ]

16 голосов
/ 14 июля 2011

В Tomcat Wiki - В каком порядке запускаются веб-приложения (или Как изменить порядок запуска)?

Нет ожидаемого заказа на запуск. Ни спецификация сервлета, ни Tomcat определить один. Вы не можете полагаться на приложения, начинающиеся в любом конкретный заказ.

Tomcat поддерживает , никогда не поддерживает указание порядка загрузки веб-приложений. Существуют и другие контейнеры, например JBoss , но Tomcat никогда не делает. Любое очевидное поведение, которое выглядит как упорядочение загрузки через алфавитный порядок имен веб-приложений, является случайным и не гарантируется, что оно будет работать во всех случаях.

То, о чем вы, вероятно, думаете, это элемент <load-on-startup/>, если web.xml указывает порядок загрузки servlets.

При этом существует элегантное решение, использующее протокол обнаружения служб.

Одним из решений является использование что-то вроде ZeroConf и регистрация ваших служб при запуске, а затем поиск зависимых приложений, когда эти службы становятся доступными, подключение к ним и выполнение того, что им нужно делать, когда служба готова. Вот как я работаю с несколькими зависимыми службами уже много лет. У меня есть службы Python, Java и Erlang, которые все обнаруживают друг друга через ZeroConf.

7 голосов
/ 30 ноября 2012

Это правда, что Tomcat не предоставляет никакого способа обеспечения порядка развертывания.

* Tomcat развертывает веб-приложения в следующем порядке: *

1. Сначала будут развернуты любые дескрипторы контекста.

2После этого будут развернуты взорванные веб-приложения, на которые не ссылается ни один дескриптор контекста.Если у них есть связанный файл .WAR в appBase, и он новее, чем разнесенное веб-приложение, разорванный каталог будет удален, а веб-приложение будет повторно развернуто из файлов .WAR

3.WAR будут развернуты

> Вот предлагаемое решение:


Если вы хотите указать порядок развертывания, определите контекст для своего веб-приложения в $ CATALINA_BASE / conf /[enginename] / [hostname] /MyApp.xml

Tomcat сканирует $ CATALINA_BASE / conf / [enginename] / [hostname] /, выполняя File listFiles (), который возвращает массив файлов, отсортированный по значению хеша (зависит от ОС)).

Вы можете использовать следующий код для проверки порядка развертывания веб-приложений

File file = new File("/opt/tomcat/conf/Catalina/localhost");
        File[] files = file.listFiles();
        for (File f : files)
        {
            System.out.println("Filename: " + f.getName());
        }
3 голосов
/ 12 сентября 2016

Существует три способа развертывания webapp.war в Tomcat.

  1. Добавление элемента Context внутри элемента Host в файле $CATALINA_BASE/conf/server.xml.

    <Server><Service><Engine><Host>
        <Context path="[webappName]" docBase="[webappPath]"/>
    </Server></Service></Engine></Host>
    
  2. Создайте файл $CATALINA_BASE/conf/[engineName]/[hostName]/[webappName].xml с содержанием:

    <Context docBase="[webappPath]"/>
    
  3. Добавьте файл webapp.war непосредственно в каталог $CATALINA_BASE/webapps/.

Следующая последовательность развертывания произойдет при запуске Tomcat:

1 → 2 → 3


Некоторые пояснения :

  • $ CATALINA_BASE

    Ссылка на базовый каталог, для которого разрешены большинство относительных путей.Если вы не настроили Tomcat для нескольких экземпляров, установив каталог CATALINA_BASE, то для $ CATALINA_BASE будет установлено значение $ CATALINA_HOME, каталога, в который вы установили Tomcat.

  • docBase

    Путь к файлу WAR веб-приложения.Вы можете указать абсолютный путь для этого файла WAR или путь относительно каталога appBase хоста-владельца.

  • engineName:

    имя движка, связанное с контекстом.Имя по умолчанию: Catalina.

  • hostName:

    Имя хоста, связанного с контекстом.Имя по умолчанию: localhost.


Предположим, что:

  • существует 3 веб-приложения: a.war, b.war и c.war.
  • b.war зависит от a.war.
  • c.war зависит от b.war.
  • Server.Service.Engine.name = "Catalina"
  • Server.Service.Engine.Host.name = "localhost"
  • Server.Service.Engine.Host.appBase = "webapps"

Попробуйте выполнить следующие действия:

  1. Поместите все военные файлы в каталог $CATALINA_BASE/webapps/.
  2. создайте файл $CATALINA_BASE/conf/Catalina/localhost/b.xml с содержанием:

    <Context docBase="b.war"/>
    
  3. Добавить Context элемент в файл $CATALINA_BASE/conf/server.xml:

    <Server><Service><Engine><Host>
        <Context path="a" docBase="a.war"/>
    </Server></Service></Engine></Host>
    

Ссылка:

2 голосов
/ 26 марта 2014

Извинения за перекрестную публикацию ( Tomcat - запуск веб-приложений в определенном порядке ), но я подумал, что это также актуально и здесь:

Вы можете определить несколько служб в вашем server.xml,которые работают на разных портах.Сервисы запускаются последовательно в порядке их появления в server.xml.Это означает, что у вас может быть, например, служба конфигурации, работающая в первой службе, а затем приложения, которые зависят от нее, во второй (я использую одну по умолчанию Catalina для остальных ...)

Вы можете увидеть больше информации здесь: http://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q27

И это услуга, которую я включаю до Служба Catalina:

<Service name="ConfigService">
    <Connector port="8081" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8444" />
    <Engine name="ConfigServiceEngine" defaultHost="localhost">
        <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

            <Context path="/" reloadable="true" docBase="/path/to/your/service/directory" />
        </Host>
    </Engine>
</Service>

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

NB. Важно изменить имя службы и механизма.

НТН

0 голосов
/ 08 декабря 2016

Мы запускаем несколько котов. Мы можем вызывать группы приложений независимо, помещая первую группу в одного кота, а последующие в секунду.

Предполагается, что они не пытаются общаться друг с другом с помощью JVM.

0 голосов
/ 07 июня 2013

Этого довольно легко достичь, если вам все равно взломать код tomcat и создать собственный экземпляр Host

1) Создайте подкласс org.apache.catalina.core.StandardHost, скажем, MyHost:

class MyHost extends org.apache.catalina.core.StandardHost{
    public MyHost (){
    super();
    //changing HashMap for a predictable ordered Map :)
    this.children = new LinkedHashMap();
    }
} 

2) зарегистрируйте свой класс в теге xml Host вашего сервера ()

Невероятно, но это решает проблему, если все ваше веб-приложение объявлено в правильном порядке внутри тега Host:

<Host>
 <context app1>
 <context app2>

Thaen app1 запустится до app2, независимо от того, какой SO вы использовали.

0 голосов
/ 14 июля 2011

Вы всегда можете переместить первый файл .war в каталог tomcat, затем дождаться его развертывания, а затем переместить следующие два в каталог tomcat.Это развернет первый, а затем развернет два других.

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

...