1.Hello
Hello.java还是和以前的一样。这里它没有再加上一个MBean接口了,只是一个很普通的类。
package jmx.modelbean;
public class Hello{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printHello() {
System.out.println("Hello World, " + name);
}
public void printHello(String whoName) {
System.out.println("Hello , " + whoName);
}
}
2.ModelMBeanUtils
ModelMbeanUtils这个类是要我们自己来实现的,也是写model
Bean最麻烦的地方,它主要是返回一个RequiredModelMBean类,此类主要包括了一个ModelMBeanInfo类的信息。在ModelMBeanInfo中定义了所有对需要管理的属性和方法的描述。具体代码如下:
package jmx.modelbean;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;
import javax.management.modelmbean.ModelMBeanOperationInfo;
import javax.management.modelmbean.RequiredModelMBean;
public class ModelMBeanUtils {
private static final boolean READABLE = true;
private static final boolean WRITABLE = true;
private static final boolean BOOLEAN = true;
private static final String STRING_CLASS = "java.lang.String";
public static RequiredModelMBean createModlerMBean() {
RequiredModelMBean model = null;
try {
model = new RequiredModelMBean();
model.setManagedResource(new Hello(), "ObjectReference");
ModelMBeanInfo info = createModelMBeanInfo();
model.setModelMBeanInfo(info);
} catch (Exception e) {
e.printStackTrace();
}
return model;
}
private static ModelMBeanInfo createModelMBeanInfo() {
//////////////////////////////////////////////////////////////////
// 属性 //
//////////////////////////////////////////////////////////////////
// 构造name属性信息
ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
"Name", // 属性名
STRING_CLASS, //属性类型
"people name", // 描述文字
READABLE, WRITABLE, !BOOLEAN, // 读写
null // 属性描述子
);
//////////////////////////////////////////////////////////////////
// 方法 //
//////////////////////////////////////////////////////////////////
//构造 printHello()操作的信息
ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//
"printHello", //
null, //
null, //
"void", //
MBeanOperationInfo.INFO, //
null //
);
// 构造printHello(String whoName)操作信息
ModelMBeanOperationInfo print2Info;
MBeanParameterInfo[] param2 = new MBeanParameterInfo[1];
param2[0] = new MBeanParameterInfo("whoName", STRING_CLASS, "say hello to who");
print2Info = new ModelMBeanOperationInfo(//
"printHello", //
null,//
param2,//
"void", //
MBeanOperationInfo.INFO, //
null//
);
//////////////////////////////////////////////////////////////////
// 最后总合 //
//////////////////////////////////////////////////////////////////
// create ModelMBeanInfo
ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
RequiredModelMBean.class.getName(), // MBean类
null, // 描述文字
new ModelMBeanAttributeInfo[] { // 所有的属性信息(数组)
nameAttrInfo },//只有一个属性
null, // 所有的构造函数信息
new ModelMBeanOperationInfo[] { // 所有的操作信息(数组)
print1Info,
print2Info },//
null, // 所有的通知信息(本例无)
null//MBean描述子
);
return mbeanInfo;
}
}
3.HelloAgent
接下来是HelloAgent的写法,和以前就差一句:把“new
Hello()”这一句删除了,加上了ModelMbeanUtils.createModlerMbean();
package jmx.modelbean;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.modelmbean.RequiredModelMBean;
import com.sun.jdmk.comm.HtmlAdaptorServer;
public class HelloAgent {
public static void main(String[] args) throws Exception {
MBeanServer server = MBeanServerFactory.createMBeanServer();
ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
// Hello hello = new Hello();
RequiredModelMBean hello = ModelMBeanUtils.createModlerMBean();
server.registerMBean(hello, helloName);
ObjectName adapterName = new ObjectName(
"HelloAgent:name=htmladapter,port=8082");
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
server.registerMBean(adapter, adapterName);
adapter.start();
System.out.println("start.....");
}
}
4.总结
我们发现模型Mbean(Model MBean)要比标准MBean(standard
mbean)复杂多了,那有什么理由让我们选择使用模型MBean吗?我认为,最大的理由就是模型MBean可以动态配置。试想一下这个应用场景:由于安全或其他原因,系统要把某个MBean公开的可管理方法隐藏起来。这时,如果你是用标准MBean,这需要修改接口类,然后重新编译发布;如果用Apache
commons-modeler来写的模型MBean,则只需要修改XML文件就行了,不需要重新编译发布(可能要重启一下系统)。这就是模型Mbean优势之所在了。
细心的人会发现动态MBean和这一节的模型Mbean非常相似,但它们还是有很大不同的:动态MBean没有Hello类,它要自己实现Hello类中的方法逻辑。
分享到:
相关推荐
Model MBean由`javax.management.modelmbean.RequiredModelMBean`类定义,它是JMX代理的一个必需部分。与Dynamic MBean类似,Model MBean的管理接口是在运行时定义的。`RequiredModelMBean`类实现了`ModelMBean`接口...
Model MBean通过实现`javax.management.modelmbean.ModelMBeanInfo`接口来定义其行为。 JMX不仅用于JVM监控,还可以用于日志级别的动态修改,例如log4j支持通过JMX来动态调整日志级别。此外,许多监控工具,如...
Model MBean通过`javax.management.modelmbean.ModelMBean`接口和一个描述符文件(如`car-mbean-descriptor.xml`)定义其行为。 描述符文件(如`car-mbean-descriptor.xml`)包含了MBean的元数据,包括属性、操作、...
动态MBean则提供了更大的灵活性,包括Open MBean和Model MBean,用于管理动态或复杂的数据结构。 **总结** JMX技术为Java开发者提供了一套强大而灵活的工具,用于构建和集成管理功能。通过MBean,开发者可以轻松地...
Standard MBeans是预定义了管理接口的类,Dynamic MBeans则可以在运行时动态定义其管理接口,而Model MBeans是一种抽象层,可以将任何Java对象转换为MBean。 MXBean是JMX中的一个特殊概念,它是标准MBean的扩展,...
MBean有四种类型:Standard MBean、Dynamic MBean、Open MBean和Model MBean。Standard MBean是最常见且最简单的形式,类似于普通的Java Bean。Dynamic MBean允许动态地获取和设置属性,适合于已存在的、不易转换为...
JMX Instrumentor 是一个微型 Java 工具,用于将任意对象检测为 JMX 模型 MBean。 它通过反射检查对象的类并构造相应的 ModelMBeanInfo。 甚至可以通过特殊的 JMX 注释来改进此信息。
Model MBeans是最通用的,它们基于元数据来定义MBean的行为。 5. 监控与通知: 通过JMX,可以注册监听器来接收关于MBean状态变化的通知。这可以用来实现自动化的故障检测、日志记录或者性能监控。此外,JMX还可以...
JMX还提供了一些附加管理协议API,如SNMP(Simple Network Management Protocol)、TMN(Telecommunications Management Network)和CIM/WBEM(Common Information Model/Web-Based Enterprise Management)。...
4. **Model MBean**: 基于XML配置,将管理接口与实现分离。 ### MBean Server MBean Server是JMX框架的核心,它负责注册和管理MBeans,提供命名和寻址机制。它还提供了MBeans之间的交互,以及与其他管理系统(如...
MBeans分为标准MBean、Dynamic MBean和Model MBean三种类型,以适应不同的需求。Server是运行MBeans的环境,它负责注册、管理MBeans,并提供给Clients访问接口。Clients则通过连接到Server来访问和操作MBeans,实现...
#### 五、JMX 规范的应用示例 例如,在一个分布式系统中,可以使用JMX来集中监控各个节点的状态,并根据实际情况进行资源调度和故障转移。又比如,在一个Web服务器集群中,管理员可以通过JMX远程监控每个服务器的...
- **Model MBeans**:模型MBeans是另一种形式的MBean,它利用反射机制自动创建一个MBean实例,而无需实现特定的接口。这种类型的MBean通常用于现有类的管理,而不需要修改源代码。 #### 五、通知机制 JMX支持一种...
- **MBean元数据类**:描述MBean的结构和行为。 #### 五、Standard MBeans实例 - **接口定义**:Standard MBeans通常通过接口定义其公共API,接口中包含特定命名规则的方法。 - **实现类**:实现类需遵循接口定义的...
实现模型MBeans通常需要使用`ModelMBean`接口,并通过`ModelMBeanInfo`类来描述MBean的行为。 #### 五、MBean服务器 MBean服务器是JMX的核心组件之一,负责注册和管理所有的MBeans。了解如何与MBean服务器交互是...
创建一个MBean通常需要实现`javax.management.MBean`接口或者继承自`javax.management.ModelMBean`类,并在其中定义属性和操作。完成MBean的定义后,可以将其注册到MBeanServer上。例如,以下代码展示了如何创建并...
JMX可以暴露MBean(Managed Beans),这些MBean代表了应用程序中的管理对象,可以通过JMX API进行操作。例如,你可以通过JMX监控应用性能指标,如内存使用情况、线程状态等。 总结: Java教程涵盖了从基础语法到...
JMX 还提供了通知模型(Notification Model),允许 MBean 广播管理事件,这种操作称之为通知。管理应用和其他对象注册成监听器。元信息类包含描述所有 MBean 管理接口的组件接口,其中包括属性、操作、通知和构造器...