首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JMX停止

使用JMX停止
EN

Stack Overflow用户
提问于 2015-12-21 10:18:38
回答 1查看 1.6K关注 0票数 2

有没有办法阻止使用Java和JMX?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-25 15:01:54

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

代码语言:javascript
复制
public interface ShutdownMBean {
    void doShutdown();
    String getName();
}

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

代码语言:javascript
复制
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+):

代码语言:javascript
复制
@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操作。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34393348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档