在contextInitialized
阶段,我的Web应用程序启动时,基本上在启动时创建了一些servlet。但是我需要能够在webapp仍在运行时动态添加servlet。
我开始意识到这是不可能的,所以我的下一个解决方案是尝试重新部署webapp或重新启动tomcat。是否可以从应用程序内部重新部署应用程序?甚至在上下文已初始化之后添加servlet?
在这一点上,只需重新部署.war就足够了。
答案 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);