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