Ошибка доступа к Cassandra MBeans из Java

Я пытаюсь получить доступ к метрикам обмена сообщениями, предоставленным Cassandra из Java, используя JMX. Я получаю правильные результаты, когда использую следующий запрос со швейцарским ножом Java

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();
        }
    }

Может кто-нибудь объяснить, где я делаю ошибку?

1 ответ

Решение

Швейцарский Нож Java, кажется, принимает подстановочный знак ObjectName (или образец) как:

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

но ваш код просто ищет не шаблонный MBean как:

org.apache.cassandra.metrics:type=Messaging

Измените свой код на:

  1. Используйте шаблон
  2. queryNames вернет набор совпадающих ObjectNames, так что перебирайте набор и запрашивайте каждое из них.
  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());
}
Другие вопросы по тегам