【问题标题】:Error accessing Cassandra MBeans from Java从 Java 访问 Cassandra MBean 时出错
【发布时间】:2017-01-06 15:01:08
【问题描述】:

我正在尝试使用 JMX 从 Java 访问 Cassandra 提供的消息传递指标。当我将以下查询与 swiss java knife 一起使用时,我得到了正确的结果@

java -jar sjk-plus-0.4.2.jar mx -s localhost:7100 -mg -all -b org.apache.cassandra.metrics:type=Messaging,name=* -f Mean
org.apache.cassandra.metrics:type=Messaging,name=CrossNodeLatency
1331.0469921040174
org.apache.cassandra.metrics:type=Messaging,name=datacenter1-Latency
1331.1071897694487

但是,使用以下 Java 代码,我得到了 javax.management.InstanceNotFoundException: org.apache.cassandra.metrics:type=Messaging 异常。

JMXServiceURL url = null;
        try {
            url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:7100/jmxrmi");
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        JMXConnector mConnector = null;
        try {
            mConnector = JMXConnectorFactory.connect(url);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        MBeanServerConnection mMBSC = null;
        try {
            mMBSC = mConnector.getMBeanServerConnection();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ObjectName mObjectName = null;
        try {
            mObjectName = new ObjectName("org.apache.cassandra.metrics:type=Messaging");
        } catch (MalformedObjectNameException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Set<ObjectName> myMbean = null;
        try {
            myMbean = mMBSC.queryNames(mObjectName, null);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            System.out.println((mMBSC.getAttribute(mObjectName, "*")).toString());
        } catch (AttributeNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstanceNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MBeanException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ReflectionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

有人可以解释我在哪里犯了错误吗?

【问题讨论】:

    标签: java cassandra jmx


    【解决方案1】:

    Swiss Java Knife 似乎接受 ObjectName 通配符(或模式)为:

    org.apache.cassandra.metrics:type=Messaging,name=*
    

    但您的代码只是将非模式 MBean 查找为:

    org.apache.cassandra.metrics:type=Messaging
    

    将您的代码更改为:

    1. 使用模式
    2. queryNames 将返回一组匹配的 ObjectName,因此请遍历该集合并查询每一个。
    3. 您需要指定实际 MBean 属性名称的字符串数组,而不是代码中的“*”。 (如果支持就好了)

    类似:

    mObjectName = new ObjectName("org.apache.cassandra.metrics:type=Messaging,name=*");
    Set<ObjectName> names = mMBSC.queryNames(mObjectName, null);
    for(ObjectName on: names) {
      System.out.println(on + "\n" + mMBSC.getAttribute(on, "Mean").toString());
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 2014-04-06
      • 2017-05-21
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多