Tomcat - Запуск внешнего JAR / WAR

Итак, у меня есть небольшое веб-приложение Tomcat, которое я запускаю, со следующей структурой:

  • Главный сервлет
  • Класс для работы A
  • Класс для работы B
  • Класс для работы C
  • Тонны классов, используемых для выполнения различных заданий

Веб-приложение компилируется и развертывается через ant. На данный момент у меня есть хороший Project.war со всеми классами.

По сути, главный сервлет работает как диспетчер. В зависимости от полученного веб-запроса запускается задание A, B или C в новом потоке.

Я хочу улучшить свое приложение, чтобы можно было повторно развернуть класс для задания A / B / C, не затрагивая запущенные процессы. Вот как я это концептуализирую:

  • Я разворачиваю основной сервлет, используемый как диспетчер.
  • Я развертываю A.war, B.war, C.war
  • Я бегу B.war
  • Я перебрасываю A.war, B.war все еще работает
  • Я бегу A.war
  • B.war выполнен, его вывод отправляется обратно через главный сервлет.

Честно говоря, я понятия не имею, с чего начать и на что посмотреть. Я думал об использовании ProcessBuilder и выполнении jar / war в командной строке, но это кажется самым небезопасным делом.

Любой вклад приветствуется.

Спасибо !


person Shade    schedule 14.04.2018    source источник
comment
Полагаю микросервисы вашим ответом. Ваши приложения должны общаться через веб-сервисы (REST), и каждый из них лучше развернуть в отдельном докер-контейнере.   -  person Amir Pashazadeh    schedule 15.04.2018
comment
Это то, о чем я не знал, я посмотрю на это, спасибо. Если у вас есть примеры или руководство, я начну свое размышление с них!   -  person Shade    schedule 15.04.2018
comment
Если вы создаете свои собственные потоки во время работы в контейнере сервлетов, вы почти наверняка делаете это неправильно. Ожидается ли, что это приложение в первую очередь будет взаимодействовать через HTTP и предоставлять эти услуги (например, задание A, задание B и задание C)? Если это так, контейнер заменяет все, что уже делает ваш главный сервлет, и ваш код может стать проще.   -  person Christopher Schultz    schedule 16.04.2018


Ответы (1)


Я считаю, что вам нужно модульное приложение, в котором у вас есть несколько плагинов (в вашем случае - Jobs), которые можно загружать или выгружать, когда вы хотите, и использовать их, когда они станут доступны. Проверьте этот вопрос о стеке, он может вам немного помочь.

Но для простоты в предыдущей работе нам нужно было что-то вроде OSGI без использования OSGI, мы создали API, используя serviceLoader и создал интерфейс для нашего модуля (в вашем случае job), каждая банка будет иметь класс, который будет реализовывать интерфейс. И как только задание понадобится, вы можете вызвать его из загрузчика службы, если он существует, вы можете использовать его, если не выдадите какую-то ошибку.

person Akhadra    schedule 23.04.2018