钟欣潼演过的爱情电影:JMX基础

来源:百度文库 编辑:九乡新闻网 时间:2024/10/06 00:11:03

JMX在J2SE 5和J2SE 6平台略有不同,我们基于J2SE 6来学习JMX。JMX已经成功Java2平台的一部分,它的目标是动态管理和监控你所感兴趣的资源,例如应用程序、设备、服务、JVM等。JMX能够支持通过本地和远程访问的方式,来实现对相关资源的管理和监控。JMX只是对应用程序管理的扩展,而非必选,那么,如果我们选择为系统实现JMX管理功能,能够带来哪些好处呢?

第一、基于JMX来管理现有的Java应用程序,可以非常容易的基于Java技术实现,而无需更大的投入;

第二、JMX定义了一种规范和一组标准API,业界已经将JMX技术纳入到自己的产品中来,例如JBoss、Weblogic等;

第三、JMX具有一套标准的架构,使得在管理方面具备动态性、灵活性、可扩展性和稳定性;

第四、JMX可以非常容易地与其他管理方案进行整合,如通过浏览器来访问代理服务器(MBean Server)。

 

下面,我们看一下,JMX的技术架构,可以分为三层:

1、设备层

这一层定义了需要管理的资源,如应用程序、设备、服务、网络,将这些资源以Java对象的形式,以MBean的方式暴露管理接口,例如标准MBean,通过定义名称含有MBean后缀的管理接口,在实现这些接口时与待管理的资源相关联,之后将这些Java对象注册到代理服务器(MBeanServer)来实现远程管理和监控。

例如,我们定义了一个标准MBean管理接口(其它MBean可以参考相关文档):

view plain
  1. package org.shirdrn.java.jmx.standardmbean;  
  2.   
  3. public interface MyObjectMBean {  
  4.     public long getId();  
  5.     public String getName();  
  6.     public void setName(String name);  
  7.     public String show();  
  8. }  

MBean的实现示例如下所示:

view plain
  1. package org.shirdrn.java.jmx.standardmbean;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5. public class MyObject implements MyObjectMBean {  
  6.       
  7.     private static final Logger LOG = Logger.getLogger(MyObject.class);  
  8.     private long id;  
  9.     private String name;  
  10.   
  11.     public MyObject() {  
  12.         super();  
  13.     }  
  14.   
  15.     public MyObject(long id, String name) {  
  16.         super();  
  17.         this.id = id;  
  18.         this.name = name;  
  19.     }  
  20.   
  21.     public long getId() {  
  22.         return id;  
  23.     }  
  24.   
  25.     public void setId(long id) {  
  26.         this.id = id;  
  27.     }  
  28.   
  29.     public String getName() {  
  30.         return name;  
  31.     }  
  32.   
  33.     public void setName(String name) {  
  34.         this.name = name;  
  35.     }  
  36.   
  37.     public String show() {  
  38.         StringBuffer sb = new StringBuffer().append("id=").append(id).append(", name=")  
  39.         .append(name);  
  40.         LOG.info("show()=" + sb.toString());  
  41.         return sb.toString();  
  42.     }  
  43. }  

可以看到,管理接口中暴露了4个方法,可以查看但不能修改id,可以查看并修改name,可以调用show方法。

需要注意的是,对于标准MBean,如果MBean管理接口定义为xxxMBean,则实现一定为xxx,否则就无法通过MBean Server查找到对应的资源。

2、代理层

代理层为待管理对象(如实现标准MBean管理接口的Java对象)提供了一个容器,其中只有满足要求并注册到容器中对象才能实现JMX管理。代理层最主要的组件就是MBean Server,它在我们的应用系统中充当一个管理功能的代理。

JavaSE 6平台中,可以通过调用ManagementFactory.getPlatformMBeanServer()来获取到一个MBean Server,然后向其中注册实现好的MBean资源,就能够通过JMX进行管理。

查找本地的MBean Server(如果没有找到,会自动创建一个),有关如何查找以及可能需要创建,可以通过ManagementFactory.getPlatformMBeanServer()的代码来实现跟踪。示例如下所示:

view plain
  1. package org.shirdrn.java.jmx.standardmbean;  
  2.   
  3. import java.lang.management.ManagementFactory;  
  4.   
  5. import javax.management.InstanceAlreadyExistsException;  
  6. import javax.management.MBeanRegistrationException;  
  7. import javax.management.MBeanServer;  
  8. import javax.management.MalformedObjectNameException;  
  9. import javax.management.NotCompliantMBeanException;  
  10. import javax.management.ObjectName;  
  11.   
  12. public class MyJMX {  
  13.   
  14.     private static MBeanServer mBeanServer = null;  
  15.     static {  
  16.         if(mBeanServer==null) {  
  17.             mBeanServer = ManagementFactory.getPlatformMBeanServer();  
  18.         }  
  19.     }  
  20.   
  21.     public void register(Object objectMBean, ObjectName objectName)  
  22.             throws InstanceAlreadyExistsException, MBeanRegistrationException,  
  23.             NotCompliantMBeanException {  
  24.         mBeanServer.registerMBean(objectMBean, objectName);  
  25.     }  
  26.   
  27.     public static void main(String[] args) throws InterruptedException,  
  28.             InstanceAlreadyExistsException, MBeanRegistrationException,  
  29.             NotCompliantMBeanException, MalformedObjectNameException,  
  30.             NullPointerException {  
  31.         MyJMX jmx = new MyJMX();  
  32.         String objectNameString = "mydomain:mykey=MyObjectMBean";  
  33.         ObjectName objectName = new ObjectName(objectNameString);  
  34.         MyObjectMBean myObjectMBean = new MyObject(299999007, "shirdrn");  
  35.         jmx.register(myObjectMBean, objectName);  
  36.   
  37.         Object lock = new Object();  
  38.         synchronized (lock) {  
  39.             lock.wait();  
  40.         }  
  41.     }  
  42. }  

在启动参数中,需要设置-Dcom.sun.management.jmxremote选项,表示可以通过远程进行管理。

3、远程管理层

我们要管理应用系统的某些资源,是通过代理层来间接实现管理,那么在与代理层之间交互最为直接,所以远程远程管理层定义了我们通过什么方式来与MBean Server进行交互,如基于何种协议、怎样建立连接才能通过远程手段在MBeanServer的JVM之外进行访问,从而实现管理和监控,例如基于JMXMP、RMI等。

所以,远程管理层最重要的两个组件就是协议适配器和连接器。

Sun公司实现了一个基于JMXMP协议的工具JConsole,可以通过JConsole来方便地进行调试。启动JConsole后,可以通过本地进程或远程进程来进行远程管理。

例如,创建一个基于RMI协议的连接器,示例如下:

view plain
  1. String serviceURL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";  
  2.         JMXServiceURL url = new JMXServiceURL(serviceURL);  
  3.         JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbeanServer);  

 

 

参考链接:

http://download.oracle.com/javase/6/docs/technotes/guides/jmx/index.html