【问题标题】:How do I programmatically dump JMX data?如何以编程方式转储 JMX 数据?
【发布时间】:2010-02-25 17:14:48
【问题描述】:

我希望能够记录通过 jconsole 访问的所有 JMX 数据。有没有办法以编程方式做到这一点?我正在构建一种系统日志记录形式,我想使用类似于 jconsole 的工具创建可查看的间隔数据。

我该怎么做呢?

【问题讨论】:

    标签: java logging jmx jconsole


    【解决方案1】:

    java.lang.management.ManagementFactory 让您可以访问 JMX 数据。

    例如

    List<MemoryPoolMXBean> memPoolBeans = ManagementFactory.getMemoryPoolMXBeans();
    for (MemoryPoolMXBean mpb : memPoolBeans) {
        System.out.println("Memory Pool: " + mpb.getName());
    }
    

    SO 查询中提供了一些示例:[java]+managementfactory

    好书:https://www.ibm.com/developerworks/library/j-jtp09196/index.html

    对于连接到远程 VM 的完整实现:​​

    Map<String,String[]> env = new HashMap<String, String[]>();
    env.put( JMXConnector.CREDENTIALS, new String[]{"user","pass"} );
    JMXServiceURL address = new JMXServiceURL("service:rmi:///jndi/rmi://host:port/jmxrmi");
    JMXConnector connector = JMXConnectorFactory.connect(address,env);
    MBeanServerConnection mbs = connector.getMBeanServerConnection();
    
    //get all mbeans
    Set<ObjectInstance> beans = mbs.queryMBeans(null,null);
    
    for( ObjectInstance instance : beans )
    {
        MBeanInfo info = mbs.getMBeanInfo( instance.getObjectName() );
    }
    

    从信息中,您可以根据需要查询对象名称和属性。

    【讨论】:

    • 这行得通,但是有没有一种简单的方法可以从所有对象名中获取所有值?现在,似乎我必须获取 na MBeanServerConnection,然后使用 mbs.getAttributes(..) 单独查询每个值。有没有更好的办法?
    • 好的,我可以用queryMBeans获取所有的ObjectNames,但是还是无法自动获取所有的属性。
    • :P。现在,我可以查询所有属性,但是你这样做的方式非常迂回。我将编辑您的答案并使其更完整,然后接受它。
    • 神奇的代码 sn-ps 和信息。 IBM 页面的链接也很棒。花了很长时间尝试访问自定义 MBean,而您的最后一个 sn-p 为我做了这件事,非常感谢 +1
    【解决方案2】:

    当我想做同样的事情时,我使用这个command line JMX client 作为起点。

    【讨论】:

    • 看起来我真的想要 10.4,用于“属性”命令,但页面上的链接已损坏。有什么可以找到镜子的想法吗?
    • 我认为这是我拥有的版本。你可以在这里得到它:drop.io/jmxclient
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2015-10-26
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多