2017-01-06 10 views
2

JMXを使用してJavaからCassandraが提供するメッセージングメトリクスにアクセスしようとしています。私はしかしswiss java knifeJavaからCassandra MBeansにアクセスする際のエラー

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 

で次のクエリを使用するとき、私は私がjavax.management.InstanceNotFoundException: org.apache.cassandra.metrics:type=Messaging例外を取得するには、次のJavaコードで、正しい結果を得ます。

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

誰かが間違いを犯していると説明してください。

答えて

2

スイスJavaのナイフとしてObjectNameのワイルドカード(またはパターン)を受け入れるようだ:

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

をしかし、あなたのコードは、単に非パターンのMBeanを探しています:

org.apache.cassandra.metrics:type=Messaging 

変更あなたのコード

  1. queryNamesワットパターンを使用します。へオブジェクト名が一致するSetを返すので、セットを繰り返し処理し、それぞれを照会します。
  2. 実際の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()); 
} 
関連する問題