Tomcat - запуск веб-приложений в определенном порядке - PullRequest
14 голосов
/ 09 января 2012

Я знаю, что Tomcat и спецификация Servlet не поддерживают запуск веб-приложений в определенном порядке .

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

У меня есть веб-приложение A, которое использует Spring Remoting для предоставления общего сервиса, клиентом которого является веб-приложение B.Веб-приложение B не может инициализироваться, если не запущено веб-приложение A.Тем не менее, мой Tomcat всегда запускает веб-приложения линейно, начиная с веб-приложения B.

По соображениям инфраструктуры мне нужно, чтобы они работали на одном сервере Tomcat.

Есть идеи?

Спасибо, Рой

ОБНОВЛЕНИЕ -

Оказывается, в моем конкретном случае порядок не имеет значения.Причина в следующем: скажем, я использую один из методов ниже, чтобы запустить приложение A перед приложением B. Итак, приложение A запускается, но, поскольку удаленное взаимодействие Spring использует HTTP Invoker, порт HTTP еще не открыт (он не открываетсядо запускаются все приложения).Итак, A запустится, а B повиснет, потому что порт, который он ищет, еще не доступен.Doh.

Конечным результатом было два отдельных экземпляра Tomcat.

Ответы [ 6 ]

6 голосов
/ 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>
   </Host>

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

5 голосов
/ 10 января 2012

У нас та же проблема, и для ее решения мы опираемся на тот факт (я знаю, что он скользкий), когда приложения запускаются в порядке, определенном в <tomcat_home>/conf/server.xml.

Это, конечно, имеет недостаток в жестком кодировании приложений в server.xml, но мы можем жить с этим.

2 голосов
/ 18 мая 2015

Вот еще один трюк в Linux.

Некоторые из наших приложений веб-сервисов не могут быть развернуты из-за ошибочного WSDL.Это происходит, если они развернуты или запущены после ряда других приложений.Порядок, в котором они запускаются, зависит от порядка, в котором контекстные XML-файлы находятся в / opt / apache-tomee / conf / Catalina / localhost

. Можно проверить с помощью "ls -1f".Простой "ls" дает отсортированный вывод.

Раньше это был порядок, в котором файлы были добавлены в этот каталог, но в файловых системах ext4 порядок основан на хэше имени файла.Это можно отключить следующим образом:

# tune2fs -O ^dir_index /dev/xyz

Теперь вы можете хотя бы самостоятельно решить, в каком порядке они будут запущены.Изменение порядка: переместить все файлы во временную папку, переместить их обратно в нужной последовательности.

1 голос
/ 26 марта 2014

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

Вы можете определить несколько служб в вашем 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. Важно изменить название службы и двигателя.

НТН

1 голос
/ 10 января 2012

Теоретически вы можете создать Runnable на ExecutorService в contextInitialized(), который, в свою очередь, проверяет доступность другого веб-приложения через определенные промежутки времени (возможно, с помощью запроса HTTP HEAD?). Как только другое веб-приложение станет доступным, установите некоторый атрибут в контексте сервлета, который указывает на это. Добавьте Filter, который проверяет наличие этого атрибута и соответственно блокирует / продолжает запросы.

0 голосов
/ 20 марта 2013

Вот хороший трюк, который я использую для создания 2 уровней загрузки веб-приложений. на каждом уровне порядок не гарантируется. Это зависит от того факта, что tomcat будет загружать первые дескрипторы контекста из tomcat / conf / [Engine Name] / [Host Name] и только затем контексты из атрибута appBase элемента Host в server.xml

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

File contextDescriptor = new File(getParameter("catalina.home"),"/conf/Catalina/localhost/mywebapp.xml");
contextDescriptor.deleteOnExit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...