4

基本的に、 ここで説明されている tomcat から MBeans にアクセスできるように、 http: //docs.oracle.com/javase/tutorial/jmx/remote/custom.htmlのこのチュートリアルのコードを変更しようとしています: http ://wiki.apache.org/tomcat/FAQ/Monitoring

JMX Bean java.lang:type=Memory のインターフェースは java.lang. そのコード例を次に示します。

    ObjectName mbeanName = new ObjectName("java.lang:type=Memory");
    MemoryMXBean mxbeanProxy2 = JMX.newMXBeanProxy(mbsc, mbeanName, MemoryMXBean.class, true);
    MemoryUsage memUsage = mxbeanProxy2.getHeapMemoryUsage();
    echo("\nMemory Utilization: " + (memUsage.getUsed()/(double)memUsage.getMax()) * 100 +  "%");

ここで、mbsc は MBeanServerConnection のインスタンスです。問題は、Tomcat の組み込み MBean に同様の方法でアクセスしようとすると、Tomcat MBean 用に定義されたインターフェースが見つからないという問題に遭遇することです。JConsole から MBean を監視できますが、そのためにはコードからこれを実行できる必要があります。これは、次のような方法でも実行できることがどこかでわかりました。

ObjectName mbeanName2 = new ObjectName("Catalina:type=ThreadPool,name=\"http-apr-8080\"");
Object value = mbsc.getAttribute(mbeanName, "name");

しかし、これは私にこの例外を与えます: Exception in thread "main" javax.management.AttributeNotFoundException: No such attribute: name at com.sun.jmx.mbeanserver......

かなり基本的なものが欠けているように感じます。しかし、これに関する情報は特に非常に限られているようで、グーグルはあまり役に立ちませんでした.

4

2 に答える 2

2

今日、私は上記の Oz0234 と同じ問題を抱えていました (Windows で TomEE 1.7.0 を使用)。

MBeanServerConnection で動作します。getAttribute (objectName, attribute) メソッドですが、プロキシ Bean メソッドを使用すると機能しません。私は多くのことをチェックし、テストしました。

最後に、なぜこれが起こるのかを見つけました。答えは、Catalina ドメインの属性名は小文字で始まり他のドメイン (java.lang、java.nio、openejb など) の属性名は大文字で始まることです: http:// docs.oracle.com/javase/7/docs/api/javax/management/JMX.html

最も関連性の高い部分を抽出しました。

MyMXBean proxy = JMX.newMXBeanProxy(mbs, name, MyMXBean.class);

たとえば、MyMXBean が次のようになっているとします。

public interface MyMXBean {
  public String getSimpleAttribute();
  public void setSimpleAttribute(String value);
  public MemoryUsage getMappedAttribute();
  public void setMappedAttribute(MemoryUsage memoryUsage);
  public MemoryUsage someOperation(String param1, MemoryUsage param2);
}

Then proxy.getSimpleAttribute() will result in a call to
mbs.getAttribute(name, "SimpleAttribute").

上記の例では、プロキシ Bean ゲッター名がS impleAttribute を取得するため、属性の名前が大文字の " S "impleAttribute で始まることがわかります。残念ながら、これは Bean の getter/setter 命名規則で説明されているものとは正反対です。

また、JMX 接続で使用可能な他の Tomcat ドメイン オブジェクト (Catalina、Users) の属性を確認し、他のいくつかの属性も比較しました。属性名が大文字で始まる場合、Bean プロキシは機能します。小文字で始まる場合、次のように getAttribute メソッドのみが機能します。

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
try(JMXConnector jmxc = JMXConnectorFactory.connect(url)) {
  MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
  ObjectName mbeanName = new ObjectName("Catalina:type=Manager,context=/,host=localhost");
  Object value = mbsc.getAttribute(mbeanName, "activeSessions");
}

したがって、どの方法を選択するかに注意を払う必要があります。

于 2015-11-08T23:24:19.080 に答える