1,概念:一个可以使用JMX管理器来管理的Java对象称为JMX管理资源(JMX manageable resource)。事实上,一个JMX管理资源也可以是一个应用程序、一个实现或者一个服务、设备、用户等等。JMX管理资源用Java写或者提供一个Java包装。
要想让一个Java对象称为JMX管理资源,必须创建另一个名为Managed Bean或者MBean的对象。org.apache.catalina.mbeans包包括一些MBeans。ConnectorMBean, StandardEngineMBean, StandardHostMBean, StandardContextMBean是Managed Bean的例子。从他们的名字你可以猜到ConnectMBean用于管理连接器,StandardContextMBean用于管理org.apache.catalina.core.StandardContext对象等等。当然,你也可以编写MBean管理多个Java对象。 MBean将Java对象的属性和方法暴露给管理应用程序(management application)。管理应用程序本身不能直接访问Java对象。因此可以选择任意的属性和方法让管理应用程序访问。
一共有四种MBean:标准standard,动态dynamic, 打开open, 和模型model,从结构上来看,JMX规范分为3层,设备层(instrumentation level),代理层(agent level),和分布服务层(distributed services level)。MBean服务器处于代理层,而MBeans处于设备层。分布服务层将会在JMX规范的未来版本涉及到。
2.标准MBean是最简单的MBean。要是用标准MBean管理一个Java对象,需要以下工作:
· 创建一个接口,名为你的类名加上后缀MBean。例如,如果要管理的Java类是Car,接口名酒味CarMBean。
· 修改Java类,让它实现你创建的接口。
· 创建一个代理,该代理必须包括一个MBean服务器。
· 为你的MBean创建一个ObjectName。
· 初始化MBean服务器。
· 向MBean服务器注册MBean。
package ex20.pyrmont.standardmbeantest; public class Car { private String color = "red"; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public void drive() { System.out.println("Baby you can drive my car."); } }
//1: The modified Car class
package ex20.pyrmont.standardmbeantest; public class Car implements CarMBean { private String color = "red"; public String getColor() { return color; } public void setColor(String color) { this.color = color; }
public void drive() { System.out.println("Baby you can drive my car."); } }
//2: The CarMBean interface package ex20.pyrmont.standardmbeantest; public interface CarMBean { public String getColor(); public void setColor(String color); public void drive(); }
//3: The StandardAgent class package ex20.pyrmont.standardmbeantest; import javax.management.Attribute; import javax.management.ObjectName; import javax.management.MBeanServer; import javax.management.MBeanServerFactory; public class StandardAgent { private MBeanServer mBeanServer = null; public StandardAgent() { mBeanServer = MBeanServerFactory.createMBeanServer(); } public MBeanServer getMBeanServer() { return mBeanServer; } public ObjectName createObjectName(String name) { ObjectName objectName = null; try { objectName = new ObjectName(name); } catch (Exception e) { } return objectName; } private void createStandardBean(ObjectName objectName, String managedResourceClassName) { try { mBeanServer.createMBean(managedResourceClassName, objectName); } catch(Exception e) { } } public static void main(String[] args) { StandardAgent agent = new StandardAgent(); MBeanServer mBeanServer = agent.getMBeanServer(); String domain = mBeanServer.getDefaultDomain(); String managedResourceClassName = "ex20.pyrmont.standardmbeantest.Car"; ObjectName objectName = agent.createObjectName(domain + ":type=" + managedResourceClassName); agent.createStandardBean(objectName, managedResourceClassName); // manage MBean try { Attribute colorAttribute = new Attribute("Color","blue"); mBeanServer.setAttribute(objectName, colorAttribute);
System.out.println(mBeanServer.getAttribute(objectName, "Color")); mBeanServer.invoke(objectName,"drive",null,null); } catch (Exception e) { e.printStackTrace(); } } }
如果运行StandardAgent类,会得到以下输出。
blue
Baby you can drive my car.