使用 JMX 停止 Apache Tomcat

Stop Apache Tomcat using JMX

有什么方法可以使用 Java 和 JMX 来停止 Apache Tomcat 吗?

我想有一个可用于此的托管 bean?

Tomcat 本身并没有从 JMX 关闭操作 运行 的能力,基本上是不安全的!但是如果你真的需要它,你需要创建你自己的 ShutdownMBean。创建 MBean 并在应用程序部署时注册它的过程非常简单直接。 让我们首先创建 ShutdownMBean ,它将具有名称并将公开单个 doShutdown() 操作。

public interface ShutdownMBean {
    void doShutdown();
    String getName();
}

实现也很简单,发送SHUTDOWN信号到Tomcat的默认关闭端口即可。

public class Shutdown implements ShutdownMBean{

    @Override
    public void doShutdown() {
        try {
            Socket clientSocket = new Socket("localhost", 8005);
            clientSocket.getOutputStream().write("SHUTDOWN".getBytes());
            clientSocket.getOutputStream().close();
            clientSocket.close();
        } catch (IOException e) {
        }
    }

    @Override
    public String getName() {
        return "Shutdown JMX Hook";
    }

}

最后只需在上下文初始化后注册 ShutdownMBean(我假设您使用的是 Tomcat 7+):

@WebListener
public class ShutdownListener implements javax.servlet.ServletContextListener{

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {

    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        try {
            ShutdownMBean shutdownMBean = new Shutdown();
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
            ObjectName name = new ObjectName("com.example:type=Shutdown");
            server.registerMBean(shutdownMBean, name);
        } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException | MalformedObjectNameException e) {
        }
    }
}

就是这样,只需部署您的应用程序,使用 JConsole 连接到您的 Tomcat,您将在 com.example

下找到 doShutdown 操作