在JMX的规范中,可以将Agent layer和instrumentation layer放在被管理应用,这样可以用MBean进行本地的资源管理,如果Agent layer和instrumentation layer和被管理应用分离,用JMX的实现管理多个远程应用的情况下,则需要JMX的M-let服务下载远程的MBean来进行资源管理。JMX规范中不只提供了动态加载MBean,而且提供了远程下载MBean的方法。本文介绍一下M-let服务进行动态远程下载java class的方式。
首先要知道的是M-let Class Loader作为JMX的一个服务,也是以MBean的形式存在的,因此需要实现MLetMBean接口;为了实现该MBean的下载功能,需要继承java.net.URLClassLoader。因为M-let Class Loader是一个MBean,因此可以被JMX中的代理直接的调用,也可以被management application远程调用和管理。本文假设MletTest(继承了URLClassLoader并且实现了MLetMBean接口)作为一个M-let Class Loader,下面介绍一下M-let Class Loader的动态下载方式。
1.利用M-let文件进行远程下载
M-let文件和xml文件极为相似,在JMX规范中规定了M-let的书写结构,可以参考JMX in Action或者Sun官方的文档。例如:
xml 代码
- <MLET CODE=jmxbook.ch2.HelloWorld ARCHIVE=test.jar NAME=hello:type=HelloWorld>
- MLET>
achive指明了远程的jar包名,code指明了其中的M-let所要动态下载的类,Name指的是该MBean注册到MBean Server中的ObjectName的字符串。因为没有定义codebase属性(该属性定义jar文件的相对路径),所以此M-let文件需要和jar包放在同一目录。MletTest的getMBeansFromURL方法是用于M-let文件远程下载java class的方法。
MletTest中实现的getMBeansFromURL方法部分代码
-
- echo("\tURL = " + url_2);
- Object mletParams_2[] = {url_2};
- String mletSignature_2[] = {"java.lang.String"};
- Set mbeanSet = (Set) server.invoke(mletName, "getMBeansFromURL",
- mletParams_2, mletSignature_2);
- for (Iterator i = mbeanSet.iterator(); i.hasNext(); ) {
- Object element = i.next();
- if (element instanceof ObjectInstance) {
-
- echo("\tOBJECT NAME =
- " + ((ObjectInstance)element).getObjectName());
- } else {
-
- echo("\tEXCEPTION = " + ((Throwable)element).getMessage());
- }
- }
在第五行利用反射调用MletTest的getMBeansFromURL方法,得到的是远程的M-let文件中所描述的Mlet元素的集合。把远程的MBean下载到服务端后,当需要在MBean Server上注册MBean的时候,需要将MletTest的ObjectName作为Class Loader来将下载的MBean注册到MBean Server。因此需要以下代码来完成:
MletTest中实现的getMBeansFromURL方法部分代码
-
-
- String triangleClass = "HelloWorld";
- ObjectName triangleName = new ObjectName(
- "hello:type=" + triangleClass);
- Object triangleParams[] = {new Integer(20)};
- String triangleSignature[] = {"java.lang.Integer"};
- server.createMBean(triangleClass, triangleName, mletName,
- triangleParams, triangleSignature);
2.直接下载远程MBean
该方法不用定义M-let文件,直接可以下载远程的MBean,该方法通过调用MletTest的addURL方法来实现远程下载。
MletTest中实现的addURL方法部分代码
-
-
- Object mletParams_1[] = {url_1};
- String mletSignature_1[] = {"java.lang.String"};
- server.invoke(mletName, "addURL", mletParams_1, mletSignature_1);
在第五行利用发射调用addURL方法,将url_l所指定的远程MBean下载到服务端。但是因为不使用M-let文件,因此这里没有规定加载进来的和该MBean对应的ObjectName类,因此在服务器端建立已经下载到的MBean时,需要指定ObjectName,因此需要写:
MletTest中实现的addURL方法部分代码
-
- String squareClass = "Square";
- ObjectName squareName = new ObjectName(
- "MLetExample:name=" + squareClass);
- Object squareParams[] = {new Integer(10)};
- String squareSignature[] = {"java.lang.Integer"};
- server.createMBean(squareClass, squareName, mletName,
- squareParams, squareSignature);
分享到:
相关推荐
tomcat-catalina-jmx-remote-9.0.5 tomcat-catalina-jmx-remote-9.0.5.jar
标签:agent-jmx-3.0.1-javadoc.jar,agent,jmx,3.0.1,javadoc,jar包下载,依赖包
1. **jmx-1_2_1-ri.zip**:这个文件提供了JMX 1.2.1版本的运行时实现(Runtime Implementation,RI)。RI是JMX规范的具体实现,允许开发者在Java应用程序中使用JMX功能,如创建MBeans(Managed Beans),管理对象和...
catalina-jmx-remote.jar
`jmxri-1.2.1.jar` 和 `jmxtools-1.2.1.jar` 是与JMX相关的两个核心库文件,它们在Java应用程序中扮演着重要的角色。 `jmxri-1.2.1.jar` 是Java运行时实现(Runtime Implementation)的JMX组件。它包含了JMX代理...
cmdline-jmxclient-0.10.3.jar
jmx-prometheus-httpserver-0.17.2
标签:apollo-jmx-1.7-sources.jar,apollo,jmx,1.7,sources,jar包下载,依赖包
jmx-exporter-tomcat.yml
标签:agent-jmx-3.0.0-sources.jar,agent,jmx,3.0.0,sources,jar包下载,依赖包
jmx-prometheus-javaagent-0.16.1.jar
mina-integration-jmx-2.0.0-M6.jar
通常,这需要在Tomcat的`catalina.sh`或`catalina.bat`启动脚本中添加JMX相关参数,以及在Zabbix的Java Gateway配置中设置正确的主机和端口信息。 最后,集成`cmdline-jmxclient-0.10.3.jar`和自定义模板到Zabbix的...
标签:agent-jmx-3.0-beta-1-sources.jar,agent,jmx,3.0,beta,1,sources,jar包下载,依赖包
标签:agent-jmx-3.0-beta-1.jar,agent,jmx,3.0,beta,1,jar包下载,依赖包
标签:agent-car-jmx-3.0-beta-1-sources.jar,agent,car,jmx,3.0,beta,1,sources,jar包下载,依赖包
【描述】中提到的情况表明,当开发者试图构建一个依赖于`jmxri`的Maven项目时,可能由于某些原因,如Maven中央仓库的更新延迟或者特定版本的包被下架,导致无法通过常规方式直接获取到`jmxri-1.2.1`。在这种情况下,...