Как контролировать порядок развертывания веб-приложений при перезапуске Tomcat
У меня есть несколько военных проектов, развернутых в одном контейнере Tomcat 5.5. Они используют сервисы друг друга через http, и поэтому мне нужно убедиться, что при перезапуске Tomcat они развернуты в определенном порядке. После пары часов погуглил, не повезло.
Кто-нибудь знает, как настроить Tomcat 5.5 для развертывания войн при перезагрузке в определенном порядке?
заранее спасибо
5 ответов
Честно говоря, вам нужно пересмотреть свою архитектуру.
Ваши приложения слишком тесно связаны друг с другом.
Вероятно, у вас должно быть какое-то приложение контроллера и все приложения должны быть зарегистрированы в нем или что-то подобное.
Это просто выстрел в темноте, не зная слишком много о вашей конкретной проблеме
Не слушайте "Откровенно говоря" и "Перестройку", они, очевидно, работают в среде, где они находятся под полным контролем. Я работаю в массивно распределенной системе, у нас есть веб-приложения, разбросанные по сотням компьютеров, некоторые из этих веб-приложений принадлежат другим поставщикам, поэтому я не могу "реструктурировать". Для запуска многих служб им необходимо связаться с другими службами, чтобы получить информацию о конфигурации. Если этого сервиса нет, новый сервис не может быть запущен. В производстве есть вещи, которые действительно никогда не отключаются (балансировка нагрузки, высокая доступность и т. Д.), Но когда мне нужно настроить среду разработки на моем ноутбуке, я сталкиваюсь с этой проблемой. Самым простым решением, которое я нашел, было наименование моих веб-приложений в алфавитном порядке в порядке их начала (или добавление дополнительной буквы в начало веб-приложения, если вы хотите, чтобы имя веб-приложения было разумным, как и ваши рабочие веб-приложения). Вы также можете использовать несколько установок Tomcat (организовать свои веб-приложения и запускать экземпляры Tomcat в правильной последовательности), но это очень сложно. Последним вариантом будет использование сценария запуска для развертывания файлов.war в соответствующем порядке (с достаточным временем ожидания, чтобы заставить его работать).
Это правда, что Tomcat не предоставляет никакого способа обеспечения порядка развертывания.
Tomcat развертывает веб-приложения в следующем порядке:
1. Любые контекстные дескрипторы будут развернуты первыми.
2. Затем будут развернуты взорванные веб-приложения, на которые не ссылается ни один дескриптор контекста. Если у них есть связанный файл.WAR в appBase, и он новее, чем разорванное веб-приложение, разорванный каталог будет удален, а веб-приложение будет повторно развернуто из.WAR.
3.WAR файлы будут развернуты
Вот предлагаемое решение:
Если вы хотите указать порядок развертывания, определите контекст для вашего веб-приложения в $CATALINA_BASE/conf/[enginename]/[hostname] /MyApp.xml
Tomcat сканирует $CATALINA_BASE/conf/[enginename]/[имя хоста] /, выполняя 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());
}
Именование дескриптора развертывания соответствующим образом решит вашу проблему.
Перестройте свои приложения в ядро плюс дополнения. Поместите основной код в папку shared/lib, и веб-приложения могут получить к нему доступ оттуда.
Этого довольно легко достичь, если вам все равно, взломать код 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 вы использовали.