2015-12-21 64 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