如何使用 JMX 监控现有的 Java class?

How to Monitor an existing Java class with JMX?

我有一个现有的 Java class 如下,我想使用 JMX 监视此 class 中每个方法的方法调用次数。我该怎么做?我试过 google 但我看不到整个事情是如何连接的。如果我能看到一些代码示例就太好了

Public class RPCServer {

   public void storeSchema() { // want to count number of method invocations
       System.out.println("storeSchema");
   }

   public void getSchema() { // want to count number of method invocations
       System.out.println("getSchema");
   }

   public void storeRow() { // want to count number of method invocations
       System.out.println("storeRow");
   }

   public void getRow() {  //want to count number of method invocations
       System.out.println("getRow");
   }

} 

我想看看某些方法通过JMX执行了多少次,我提出这个方案

首先,您需要一个 class 的界面。仅此接口的方法对 JMX 可见:

public interface RPCServerInterface {
  int countMethodInvocation(String method);
}

然后在 class 中存储每个函数被调用的次数。

public class RPCServer implements RPCServerInterface{
  private int row;
  private Map<String,Integer> countByMethod = new HashMap<String,Integer>();

  // +1 to the number of time of execution of this method
  private void sumMethodInvocation(String method) {
   if ( countByMethod.containsKey(method) ) {
     int n = countByMethod.get(method);
     countByMethod.put(method, n+1);
   } else {
     countByMethod.put(method,1);
   }
  }

  // how many time the method has been invoked 
  @Override
  public int countMethodInvocation(String method){
    return countByMethod.containsKey(method)?countByMethod.get(method):0;
  }

  public void setRow(int i) { 
    // register each time is executed
    this.sumMethodInvocation("setRow"); 
    this.row = i;
  }
  public int getRow() {
    // register each time is executed
    this.sumMethodInvocation("getRow");
    return row;
  }
}}
} 

然后你必须注册你的Bean:

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
RPCServer rpcServer =  new RPCServer();
ObjectName objectName = new ObjectName("org.foo.RPCServer.jmx:type=RPCServerInterface");

StandardMBean standardMBean = new StandardMBean(rpcServer,RPCServerInterface.class);
mBeanServer.registerMBean(standardMBean, objectName);

路径org.foo.RPCServer.jmx随意。

然后你的 运行 jconsole 和你找到你正在 运行ning 的进程。

然后你可以运行命令countMethodInvocation,你可以得到执行次数。

像这样:

本教程可能有用:

what-is-jmx-mbean-jconsole-tutorial