是否可以使用Tomcat API从应用程序内部重新启动Web应用程序?

时间:2018-12-06 20:38:16

标签: java tomcat servlets war

contextInitialized阶段,我的Web应用程序启动时,基本上在启动时创建了一些servlet。但是我需要能够在webapp仍在运行时动态添加servlet。

我开始意识到这是不可能的,所以我的下一个解决方案是尝试重新部署webapp或重新启动tomcat。是否可以从应用程序内部重新部署应用程序?甚至在上下文已初始化之后添加servlet?

在这一点上,只需重新部署.war就足够了。

2 个答案:

答案 0 :(得分:0)

Manager app将允许您更新应用程序。您也许还可以使用JMX MBean进行某些操作。

Manager应用程序允许您通过update=true参数进行部署和重新部署。您还可以从那里启动,停止,重新启动应用程序。

这不是您想要的,但设置起来很容易。

答案 1 :(得分:0)

正如@JasonArmstrong所说,您可以 使用JMX Bean触发重新加载,JMX Bean在同一JVM中可用于任何应用程序。您可以重新加载自己或其他应用程序。稍后我将发布代码以演示如何做到这一点。

另一方面,如果您只想部署一个附加的servlet,则可以使用标准的Java Servlet API来实现。

Java Servlet API ServletContext接口包含方法addServlet,该方法使您可以部署新的servlet。这样,再结合该方法的返回值,应该可以让您在应用程序初始化之后部署新的servlet。

例如(在Servlet中)

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

ServletContext application = getServletContext();

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

reg.addMapping("/nyNewServlet");

更新2018-12-07

上述文字的道歉现已撤回。关于它的所有事情都是对的,除了在初始化之后不能再部署新的servlet(以及大概的过滤器之类的东西)。

==返回原始答案==

或者,如果您想重新加载上下文,仍然可以使用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);