2015-12-21 67 views
2

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

我想这是有托管bean可以使用这个?

+0

可能是你可以使用Runtime类来执行命令停止Tomcat,你会从命令行执行的方式。 – virendrao

+0

这对我来说似乎是一个巨大的安全漏洞。 – duffymo

+0

你能告诉我一些Java代码示例吗? –

回答

8

通过自己的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你会发现doShutdown运行在com.example