模型MBean是一种通用的、可配置的MBean,任何人可以用它来快速转化任何资源。模型MBean是一种动态MBean,实现了指定的接口。这些接口定义的结构,在实现这些接口时,提供了一个实例化MBean的默认的和可配置的行为。
关于模型MBean的理解不是本文重点,下面是一个参考,当然最好的方式是看JMX规范:
http://www.51testing.com/?uid-43487-action-viewspace-itemid-98380
环境:JMX1.2 JDK1.6
1. Hello.java
package com.jmxdemo.model;
public class Hello {
private String name;
public Hello() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void print() {
System.out.println("Hello " + name + "!");
}
}
Hello是被管理对象,不要求实现以MBean结尾的接口,MBeanServer通过RequiredModelMBean来对其进行管理,在HelloModel.java中我们可以看到Hello和RequiredModelMBean是通过何种方式关联的。
2. HelloModel.java
package com.jmxdemo.model;
import java.lang.reflect.Constructor;
import javax.management.Descriptor;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.RuntimeOperationsException;
import javax.management.modelmbean.DescriptorSupport;
import javax.management.modelmbean.InvalidTargetObjectTypeException;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanConstructorInfo;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;
import javax.management.modelmbean.ModelMBeanOperationInfo;
import javax.management.modelmbean.RequiredModelMBean;
public class HelloModel {
public static RequiredModelMBean createModelBean()
throws RuntimeOperationsException, MBeanException,
InstanceNotFoundException, InvalidTargetObjectTypeException {
// 模型MBean信息
ModelMBeanInfo info = buildModelMBeanInfo();
// 模型MBean
RequiredModelMBean modelMBean = new RequiredModelMBean(info);
modelMBean.setManagedResource(new Hello(), "ObjectReference");
return modelMBean;
}
protected static ModelMBeanInfo buildModelMBeanInfo() {
// --
// attributes
// ------------------------------------------------------------------
ModelMBeanAttributeInfo[] attributes = new ModelMBeanAttributeInfo[1];
// name attribute
Descriptor nameDesc = new DescriptorSupport();
nameDesc.setField("name", "name");
nameDesc.setField("displayName", "myname");
nameDesc.setField("setMethod", "setName");
nameDesc.setField("getMethod", "getName");
nameDesc.setField("descriptorType", "attribute");
attributes[0] = new ModelMBeanAttributeInfo("name", "java.lang.String",
"name say hello to", true, true, false, nameDesc);
// --
// operations
// -------------------------------------------------------------------
ModelMBeanOperationInfo[] operations = new ModelMBeanOperationInfo[3];
String className = Hello.class.getName();
// setName method
MBeanParameterInfo[] setNameParams = new MBeanParameterInfo[] { new MBeanParameterInfo(
"name", "java.lang.String", "name say hello to") };
Descriptor setNameDesc = new DescriptorSupport(new String[] {
"name=setName", "descriptorType=operation",
"class=" + className, "role=operation" });
operations[0] = new ModelMBeanOperationInfo("setName", "set name",
setNameParams, "void", MBeanOperationInfo.ACTION, setNameDesc);
// getName method
Descriptor getNameDesc = new DescriptorSupport(new String[] {
"name=getName", "descriptorType=operation",
"class=" + className, "role=operation" });
operations[1] = new ModelMBeanOperationInfo("getName", "get name",
null, "java.lang.String", MBeanOperationInfo.ACTION,
getNameDesc);
// print method
Descriptor printDesc = new DescriptorSupport(new String[] {
"name=print", "descriptorType=operation", "class=" + className,
"role=operation" });
operations[2] = new ModelMBeanOperationInfo("print", "print name",
null, "void", MBeanOperationInfo.ACTION, printDesc);
// --
// constructors
// ----------------------------------------------------------------------
ModelMBeanConstructorInfo[] constructors = new ModelMBeanConstructorInfo[1];
Constructor<?>[] ctors = Hello.class.getConstructors();
// default constructors
// Descriptor helloDesc = new DescriptorSupport();
// helloDesc.setField("name", "Hello");
// helloDesc.setField("descriptorType", "operation");
// helloDesc.setField("role", "constructor");
// helloDesc.setField("displayName", "Hello");
// constructors[0] = new ModelMBeanConstructorInfo(
// "Hello(): Constructs a Hello Object", ctors[0], helloDesc);
constructors[0] = new ModelMBeanConstructorInfo("default constructor",
ctors[0], null);
// ModelMBeanInfo
ModelMBeanInfo mmbeanInfo = new ModelMBeanInfoSupport(className,
"Simple implementation of model bean.", attributes, null,
operations, null, null);
return mmbeanInfo;
}
}
将Hello管理对象和RequiredModelMBean进行管理,提供给MBeanServer
ModelAgent.java
package com.jmxdemo.model;
import java.io.IOException;
import java.rmi.registry.LocateRegistry;
import javax.management.InstanceAlreadyExistsException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.RuntimeOperationsException;
import javax.management.modelmbean.InvalidTargetObjectTypeException;
import javax.management.modelmbean.RequiredModelMBean;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import com.sun.jdmk.comm.HtmlAdaptorServer;
public class ModelAgent {
public static final String DOMAIN = "MyModelMBean";
public static void main(String[] args) throws RuntimeOperationsException,
InstanceNotFoundException, MBeanException,
InvalidTargetObjectTypeException, MalformedObjectNameException,
NullPointerException, InstanceAlreadyExistsException,
NotCompliantMBeanException, IOException {
// mbean server
MBeanServer server = MBeanServerFactory.createMBeanServer(DOMAIN);
// register hello model mbean
RequiredModelMBean hello = HelloModel.createModelBean();
ObjectName helloname = new ObjectName(DOMAIN + ":name=helloModel");
server.registerMBean(hello, helloname);
// manage MBeans via web
HtmlAdaptorServer htmlAdaptor = new HtmlAdaptorServer();
htmlAdaptor.setPort(9998);
ObjectName htmlname = new ObjectName(DOMAIN + ":name=htmlAdaptor");
server.registerMBean(htmlAdaptor, htmlname);
htmlAdaptor.start();
System.out.println("html adaptor start...");
// manage MBeans via RMI
LocateRegistry.createRegistry(9999);
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9999/mserver");
JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
cs.start();
System.out.println("RMI start...");
}
}
通过Http和RMI两种方式提供远程访问功能。
测试:
1. 打开浏览器输入http://localhost:9998/进行管理
2.在jconsole远程连接中输入RMI访问地址,
即service:jmx:rmi:///jndi/rmi://localhost:9999/mserver,进入管理界面进行管理。
ps:打开jconsole方式
如果配置了JAVA_HOME,则打开命令行,输入jconsole即可;
在JDK安装目录下的bin目录中找到jconsole.exe,打开即可
问题:
在HelloModel.java中如果把constructors[0] = new ModelMBeanConstructorInfo("default constructor", ctors[0], null);换成注释部分,程序会报下面错误,找不到解决办法。
Exception in thread "main" javax.management.RuntimeOperationsException: Exception occurred in ModelMBeanConstructorInfo constructor
at javax.management.modelmbean.ModelMBeanConstructorInfo.<init>(Unknown Source)
at com.jmxdemo.model.HelloModel.buildModelMBeanInfo(HelloModel.java:91)
at com.jmxdemo.model.HelloModel.createModelBean(HelloModel.java:25)
at com.jmxdemo.model.ModelAgent.main(ModelAgent.java:34)
Caused by: java.lang.IllegalArgumentException: Invalid descriptor passed in parameter
... 4 more
如解决,请告知,3Q!!!
分享到:
相关推荐
Java分布式应用学习笔记09JMX-MBean的介绍
jmx 实例 rmi mbean,采用rmi方式进行jmx的mbean管理,通过这个实例能够了解jmx的应用
http.jmx模板脚本示例
java
JMX 1.2.1 Reference Implementation(重点) Include com.sun.jdmk.comm.HtmlAdaptorServer class http://www.sun.com/software/jdmk/ Downloads, sun-jdmk-runtime-5.1-b34.2.zip/SUNWjdmk/5.1/lib/jdmkrt.jar
java jmx操作示例源码 文章地址:http://blog.csdn.net/mr__fang/article/details/41645377
JMX应用实例与实现,通过一个简单的JavaWeb应用来验证JMX在应用中的植入管理和应用
利用Bad Boy访问百度操作生成的jmx文件
jmx监控MBean测试; ArchUnit参数验证;跨域处理; shiro权限控制;静态资源,“ /”映射服务启动注册到consul;并测试获取redis服务,初始化redis资源; consul监控redis服务; reids分布式锁;注意consul客户端和...
JMX到Prometheus导出器:一个收集器,该收集器可以可配置地抓取和公开JMX目标的mBean。 该导出程序旨在作为Java代理运行,公开HTTP服务器并提供本地JVM的度量。 它也可以作为独立的HTTP服务器运行,并刮擦远程JMX...
JMX是指Java管理扩展,通过jmx可以监控java应用服务器的各项性能指标,jvm的性能指标等
通用 JMX MBean 收集器,它使用 Boundary API 创建指标并发布它们。 这个 java 应用程序读取一个配置文件,其名称作为参数传递。 配置文件是一个 JSON 结构,它定义了 JMX 连接、要收集的 MBean 属性以及边界度量...
JMX以RMI方式连接的场景示例,从“服务器A远程获取服务器B的历史IP访问记录”这一场景出发,将JMX框架的各层简单的串了一遍。其中包括了MBean、Agent、Client每个层的详细代码和说明
为什么JMX那么受欢迎,JMX到底有那些优势只得人们去学习和理解,本文从JMX的基本架构、hellowold jmx以及spring对JMX的支持讲起,希望大家能通过本文对JMX有个基础的认识,并能通过本文为今后学习JMX打个基础
JMX Instrumentor 是一个微型 Java 工具,用于将任意对象检测为 JMX 模型 MBean。 它通过反射检查对象的类并构造相应的 ModelMBeanInfo。 甚至可以通过特殊的 JMX 注释来改进此信息。
JMX实战 书中不仅有对于基础知识的介绍,还有对于JMX开发中重大的体系架构问题的深入探讨,总结了大量JMX开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个典型的例子,兼顾各种开发平台,这些...
入门好例子,希望对大家有用,eclipse下导入直接可以运行。
1.JMX与SPRING 结合实例 2.标准MBean 与非标准MBean 注册 3.基于接口和注解的MBean 注册 4.发布通知,处理通知及配置
Vert.x 通过 JMX 向 ... % mvn test -Pmain ... [WARNING] Warning: killAfter is now deprecated. Do you need it ? Please comment on MEXEC-6. Listening MBean Found io.vertx.ext.metrics.reporters....