Есть ли способ перезапустить веб-приложение из приложения, используя Tomcat API? - PullRequest
0 голосов
/ 06 декабря 2018

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

Я начинаю понимать, что это может быть невозможно, поэтому мое следующее решение было попытаться повторно развернуть веб-приложение или перезапустить tomcat.Можно ли повторно развернуть приложение изнутри приложения?Или даже добавить сервлет после того, как контекст уже инициализирован?

На данный момент достаточно просто переустановить .war.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Как говорит @JasonArmstrong, вы можете инициировать перезагрузку с помощью JMX Beans, которые доступны в одной JVM для любого приложения.Вы можете перезагрузить себя или другое приложение.Позже я опубликую код, чтобы показать, как это сделать.

С другой стороны, если все, что вам нужно, это развернуть дополнительный сервлет, , вы можете сделать это с помощью стандартных API-интерфейсов Java-сервлетов.

Интерфейс Java Servlet API ServletContext содержит метод addServlet, который позволяет развертывать новый сервлет.Это, в сочетании с возвращаемым значением из этого метода, должно позволить вам развернуть новый сервлет после инициализации приложения.

Например (в Servlet)

Servlet servlet = ...; // Make your servlet, here

ServletContext application = getServletContext();

ServletRegistration.Dynamic reg = application.addServlet("MyNewServlet", servlet);

reg.addMapping("/nyNewServlet");

ОБНОВЛЕНИЕ 2018-12-07

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

== Вернуться к исходному ответу ==

Или, если вы хотите перезагрузить контекст, вы все равно можете сделать это с помощью JMX.Код выглядит примерно так:

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;

// Get the JVM's local "server" (there should be only one)
MBeanServer mbs = MBeanServerFactory.findMBeanServer(null).get(0);

// Create an "object name" that points to the application's
// context in Tomcat's MXBean tree. You might want to use
// jvisualvm or a similar MBean explorer to locate your
// application to get the exact right syntax for your context
// in the tree. Tomcat version may affect this value.
ObjectName objectName = new ObjectName("Catalina:j2eeType=WebModule,name=//localhost/contextname,J2EEApplication=none,J2EEServer=none");

// Invoke the "reload" method, which will 
mbs.invoke(objectName, "reload", null, null);
0 голосов
/ 06 декабря 2018

Приложение Manager позволит вам обновить приложение.Вы также можете что-то делать с JMX MBeans.

Приложение Manager позволяет развертывать и повторно развертывать с помощью параметра update=true.Вы также можете запускать, останавливать, перезапускать приложение оттуда.

Это не совсем то, что вы искали, но его довольно легко настроить.

...