java—有没有办法使用TomcatAPI从应用程序内部重新启动webapp?

doinxwow  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(321)

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

f5emj3cl

f5emj3cl1#

正如@jasonarmstrong所说,您可以使用jmxbean触发重载,jmxbean在同一jvm中对任何应用程序都可用。您可以重新加载自己或其他应用程序。稍后我将发布代码来演示如何做到这一点。
另一方面,如果您只想部署一个额外的servlet,那么可以使用标准的javaservlet api来实现。
JavaServletAPI 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);
y3bcpkx1

y3bcpkx12#

manager应用程序将允许您更新应用程序。您还可以使用jmx mbean做一些事情。
manager应用程序允许您通过 update=true 参数。你也可以从那里启动,停止,重新启动一个应用程序。
这不完全是你想要的,但它很容易设置。

相关问题