简单理解,就是管理程序的一个协议,官方给出的答案是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务。用我们都能理解的大白话来说,JMX是一个框架,它提供了这样一种功能:通过使用JMX,我们可以实时查询应用程序中通过JMX向外公布的相应参数或者是其他应用数据,同时,我们也可以通过JMX来实时的调用应用程序使用JMX向外公布的接口,从而来实现一些操作。
JMX 简单例子:(注意 JMS 中的MBean 接口 和 Bean 对象必须在一个包内,不然根据 ObjectMBean 和 Object 无法匹配上 )
1:首先创建接口MBean,这里有个命名规则, 类名+Mbean作为接口名称,那么对象名称就是接口名称去掉 MBean,系统自动按照这个规则来匹配对象。
同时,MBean 中的方法都是通过get 和set 来获取,注意get 或 set 后第一个字母要大写。
public interface UserMBean {
public String getName();
public void setName(String name);
public void printName();
public void printName(String name);
}
2: 创建Bean对象 实现接口MBean
public class User implements UserMBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printName() {
System.out.println("hello "+this.name);
}
public void printName(String name) {
// TODO Auto-generated method stub
System.out.println("你好:"+name);
}
}
3: 最重要的一点 定义 agent 层
package com.tide.bean;
import java.io.IOException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import com.sun.jdmk.comm.HtmlAdaptorServer;
import com.tide.agent.User;
public class UserAgent {
public static void main(String args[]) throws MalformedObjectNameException,
NullPointerException, InstanceAlreadyExistsException,
MBeanRegistrationException, NotCompliantMBeanException, IOException {
int rmiPort = 1099; // 定义端口
String jmxServerName = "TestJMXServer"; // 定义MBean 的名称
MBeanServer mbs = MBeanServerFactory.createMBeanServer(jmxServerName); // 通过工厂类获取MBeanServer,用来做MBean的容器
/**
* MBeanServer添加了一个htmladapter,这样我们就可以通过网页的方式来进行管理。
*/
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
ObjectName adapterName = new ObjectName(jmxServerName + ":name=" + "htmladapter");
adapter.setPort(8082);
adapter.start();
mbs.registerMBean(adapter, adapterName);
ObjectName objName = new ObjectName(jmxServerName + ":name=" + "User");
mbs.registerMBean(new User(), objName);
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + jmxServerName);
System.out.println("JMXServiceURL: " + url.toString());
JMXConnectorServer jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
jmxConnServer.start();
}
}