一、MBean是什么
MBean就是被JMX管理的资源。一般有两种类型的MBean,标准的和动态的。 标准类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为User,则接口必须为UserMBean。 动态MBean必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义。
这里主要介绍标准MBean。
二、具体代码
接口:UserMBean.java
public interface UserMBean {
String getName();
void SetName(String name);
String getPasswd();
void SetPasswd(String pwd);
int add(int x, int y);
}
MBean: User.java
public class User implements UserMBean {
private String name;
private String passwd;
@Override
public String getName() {
return name;
}
@Override
public void SetName(String name) {
this.name = name;
}
@Override
public String getPasswd() {
return passwd;
}
@Override
public void SetPasswd(String pwd) {
this.passwd = pwd;
}
@Override
public int add(int x, int y) {
return x + y;
}
}
三、测试代码
JMXdemo.java
import java.lang.management.ManagementFactory;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
public class JMXdemo {
public static void main(String[] args) throws MalformedObjectNameException, NullPointerException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, InterruptedException {
MBeanServer server=ManagementFactory.getPlatformMBeanServer();
ObjectName objectName=new ObjectName("jmx:type=User");
User bean=new User();
server.registerMBean(bean, objectName);
String oldName=null;
String oldPwd=null;
System.out.println("jmx started!!!");
while(true){
if(oldName!=bean.getName()|| oldPwd !=bean.getPasswd()){
System.out.println(bean.getName()+":"+bean.getPasswd());
oldName=bean.getName();
oldPwd=bean.getPasswd();
}
Thread.sleep(1000);
}
}
}
先创建一个MBeanServer,相当于一个MBean的容器。然后创建一个MBean(User),并给它取名为jmx:type=User,然后将该MBean注册到MBeanServer即可。
四、利用jconsole调试
打开Java自带的调试工具jconsole,连接到该进程中,会看到有一个MBean的选项,点击进入
会看到刚才创建的那个MBean,以及它所有的属性和方法
选择Name,它当前值为空
选择下面的SetName,将Name设置为infi
再查看Name的值,发现已经被修改成功