最近觉得需要在设计方面多下些功夫,可能最近一段时间太过于沉溺于技术的细节了,所以准备把项目程序的Design细致的分析一下。有时间的话把那本Head First Design Pattern看一下。
忘记说了这个专题介绍的JMX是JDK5.0时候的标准,6.0好像有很多变动,这里不会介绍。
接着上次的继续……
其实在这个专题中我不想把JMX这门技术面面俱到,也不想太钻到细节里面,只是想写一些个人对这个技术的理解,一个是对学习的一个检验,另外其一个备忘的作用。
上一次说到了JMX分三个层次,分别是:基础部件,代理,发布。下面分别介绍这三个层次。
1,基础构件(MBean)
每一个MBean有两个部分组成,其中一个是后缀名为MBean的interface,另外一个是实现了这个接口的类,这点和EJB2.0很相似。我认为相似的原因是他们都是可以远程调用的,所以客户端只需要拿到那个实现了interface的Object就好了,不需要知道这个Object里面究竟是如何实现的。一个MBean的interface是用来定义暴露给MBeanServer的方法和属性的,其中暴露的属性是通过setter和getter方法来实现的,这个是符合JavaBean的规范的。MBean的Class则是实现这个interface,向外界提供具体的服务,这个Class的名字必须是那个接口MBean后缀的前部分。
还有一中MBean是DynamicMBean,这种MBean不需要创建接口,只需要实现DynamicMBean这个接口就行了。这种MBean的作用就是可以通过反射的机制自定义暴露的方法,属性,通知,而不使用MBeanServer提供的默认的访问规则。
还有就是Notification,这个理解起来很简单就不讲了。
2,代理层(MBeanServer)
代理层其实是管理MBean的容器,容器里面的MBean通过MBeanServer向外界提供服务,所以这层叫做代理层。
一个MBeanServer通过如下的工厂方法创建:
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
MBean可以注册到这个MBeanServer:
ObjectName name = new ObjectName("com.example.mbeans:type=Hello");
Hello mbean = new Hello();
mbs.registerMBean(mbean, name);
ObjectName是从容器中取出这个MBean的Key。一个MBeanServer中不能注册两个相同的ObjectName。
MBeanServer基本上是通过反射机制来访问容器中的MBean的,所以对外提供的访问方法和反射机制很相似,基本上就是多了一个ObjectName的参数而已,下面列几个例子:
mbs.getAttribute(mbeanObjectName, "State");
mbs.setAttribute(mbeanObjectName, stateAttribute);
mbs.invoke(mbeanObjectName, "reset", null, null);
//TODO 代理层先写到这里吧,如果以后有需要补充的再加。
3,发布层
所谓发布层就是外界访问代理层的方法。
可以通过如下的方法启动一个RMI服务器
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
Client可以连接到这个RMI服务器
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
而MBeanServer就是继承自MBeanServerConntion的,所以他们的大部分方法都一样或者相似。
OK,JMX的基本概念就介绍到这里,以后的专题就是关于JMX的lookup service和JMX的应用分析,比如在jboss和glassfish上的应用。