Как контролировать порядок развертывания веб-приложений при перезапуске Tomcat - PullRequest
2 голосов
/ 29 марта 2010

У меня есть несколько военных проектов, развернутых в одном контейнере Tomcat 5.5.Они используют сервисы друг друга через http, и поэтому мне нужно убедиться, что при перезапуске Tomcat они развернуты в определенном порядке.После нескольких часов погулять безуспешно.

Кто-нибудь знает, как настроить Tomcat 5.5 для развертывания войн при перезапуске в определенном порядке?

Заранее спасибо

Ответы [ 5 ]

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

Не слушайте "Откровенно говоря" и "Перестройку", они, очевидно, работают в среде, где они находятся под полным контролем. Я работаю с массивно распределенной системой, у нас есть веб-приложения, разбросанные по сотням компьютеров, некоторые из этих веб-приложений принадлежат другим поставщикам, поэтому я не могу «перестроить».

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

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

  • Вы также можете использовать несколько установок Tomcat (организуйте свои веб-приложения). и запустить экземпляры Tomcat в правильной последовательности), но это много накладных расходов.

  • Последний вариант - использовать сценарий запуска для развертывания .war файлы в соответствующем порядке (с достаточным временем ожидания в между, чтобы это работало).

3 голосов
/ 09 марта 2014

Это правда, что 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());
        }

Именование дескриптора развертывания решит вашу проблему.

1 голос
/ 30 марта 2010

Перестройте ваши приложения в ядро ​​плюс дополнения. Поместите код ядра в папку shared / lib, и веб-приложения смогут получить к нему доступ.

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 голосов
/ 30 марта 2010

Честно говоря, вам нужно пересмотреть свою архитектуру.

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

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

Это просто выстрел в темноте, не зная слишком много о вашей конкретной проблеме

...