这两天,正巧有个姑娘遇到JMX的问题,顺便就跟着一起研究了下。
百度百科对JMX给出了比较清晰的定义:
JMX (Java Management Extensions)是一个为应用程序,设备,系统等植入管理功能的框架。
既然是框架,那么我们来看看JMX这种框架里有些什么?
JMX模型用户定义管理容器,管理容器由MBeanServer、与托管资源对应的MBean集、每个MBean的代理和供外部管理工具访问时使用的至少 一个协议适配器或连接器成。MBeanServer充当可以在容器中使用MBean的存库,用于聚集每个托管资源的属性和操作。
JMX 规范可以分为三层: 设备层, 代理层, 分布式服务层。
设备层规范定义了编写可由 JMX 管理的资源的标准,即如何写 MBean;
代理层规范定义了创建代理的规范,封装了 MBean Server;
分布式服务层主要定义了对代理层进行操作的管理接口和构件;
设备层
JMX装备和托管资源
在JMX模型中,要管理的每个资源(一般就是我们需要管控的对象了)都必须提供一个接口。JMX托管资源是根据规范定义的模式装备的。这些模式指定了:
(1)该管理接口必须是JAVA接口并且与该资源同名,后面跟“MBean”
(2)实现类必须包括至少一个公共构造函数
(3)接口属性的getter和setter必须严格遵守命名约定
每个托管资源都要接受装备来公开一组属性和操作。通过托管Bean即MBean可以对这些属性和操作进行访问。
所谓装备的概念,个人理解就是XXXXMBean这玩意了。
代理层
代理层的核心就是MBeanServer了,MBeanServer提供给注册MBean的服务被称作JMX代理服务,它们本身也被封装成MBean的形式。JMX代理充当托管资源和管理容器的中介,使用MBeanServer注册器MBean。使用代理注册后,MBeanServer通过JAVA反射访问资源,确保符合JMX要求的模式,若有违背则抛出异常。代理服务主要包括如:动态加载(Advanced Dynamic Loading)服务、监视(Monitor)服务、定时器(Timer)服务、关联(Relation)服务等,具体代理服务的应用待后续补充。
分布式服务层
个人理解,分布式服务层的核心就是协议适配器和连接器了,MBeanServer依赖于协议适配器和连接器 用来和 运行在远程的管理应用程序进行通信。协议适配器通过特定的协议提供了一张注册在MBeanServer的管理构件视图。例如,一个HTML适配器可以将所有注册过的管理构件显示在WEB上。不同的协议,提供不同的视图。
连接器还必须提供管理应用一方的接口以使代理和管理应用程序进行通信,即针对不同的协议,连接器必须提供同样的远程接口来封装通信过程。当远程应用程序使用这个接口时,就可以通过网络透明的和代理进行交互,而忽略协议本身。适配器和连接器使MBean服务器与管理应用程序能进行通信。因此,一个代理要被管理,它必须提供至少一个协议适配器或者连接器。面临多种管理应用时,代理可以包含各种不同的协议适配器和连接器。当前已经实现和将要实现的协议适配器和连接器包括:RMI连接器、SNMP协议适配器、IIOP协议适配、HTML协议适配器、HTTP连接器 。
-------------------------------------------------------------------------------------------------------------------------------------
网上还有一部分是关于JMX管理器的,我来理解就是JMX的客户端了。使用协议适配器或连接器作为通信通道,外部管理工具能够对JMX环境中的资源进行监控和控制。
查阅了网上的一些资料,个人感觉JMX简单理解可以分为以下几部分组成:
1、MBean :描述一个可管理的资源,是一个java对象;JMX提供了4种类型的MBean,具体内容本章不做讨论。
2、MBean Server:提供MBean对象的一个管理容器,接收客户端的请求,然后调用相应的MBean。MBean需要注册到MBean Server中向外开放。
3、Adaptor:负责客户端通信 到 MBean Server之间的协议通信,连接协议包含HTTP、SNMP、RMI、IIOP等。JAVA默认自带的了JMX RMI的适配连接器,所以,只需要在启动JAVA程序的时候带上运行参数,就可以开启RMI协议的连接器。
4、MBean Client :通过JMXConnector访问远程的MBeanServerConnection,进而访问具体的MBean对象。
1、2、3 在服务端,4在客户端
-------------------------------------------------------------------------------------------------------------------------------------
百度百科是示意图,感觉还是很清晰了描述了JMX。
--------------------------------------------------------------------------------------------------------------------------------------
附上测试代码:
服务端:
public class ManagerRmiAdapt { private static MBeanServer server; public static void initServer() throws InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, MalformedObjectNameException { server = MBeanServerFactory.createMBeanServer(); InstanceMBean instance = new Instance(); server.registerMBean(instance, new ObjectName("objectName:id=instance")); } public static void bingRmi() throws MalformedURLException, IOException { Registry registry = LocateRegistry.createRegistry(9999); JMXConnectorServer connectServer = JMXConnectorServerFactory .newJMXConnectorServer(new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:9999/server"), null, server); connectServer.start(); } public static void main(String[] args) throws InstanceAlreadyExistsException, NotCompliantMBeanException, MalformedObjectNameException, InstanceNotFoundException, ReflectionException, MBeanException, UnknownHostException, IOException, InterruptedException { initServer(); bingRmi(); } }
客户端:
public class MyClient { public static void main(String[] args) throws IOException, InstanceNotFoundException, IntrospectionException, ReflectionException, MalformedObjectNameException, MBeanException { String url = "service:jmx:rmi:///jndi/rmi://localhost:9999/server"; JMXServiceURL serviceUrl = new JMXServiceURL(url); JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null); try { MBeanServerConnection mbeanConn = jmxConnector .getMBeanServerConnection(); mbeanConn.invoke(new ObjectName("objectName:id=instance"), "mointor", new Object[] {}, new String[] {}); } finally { jmxConnector.close(); } } }
装备:
public interface InstanceMBean { public void mointor(); }
资源:
public class Instance implements InstanceMBean { public void mointor() { System.out.println("Hello World!"); } }