- 浏览: 375785 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ytlviv:
利器深藏之而不用,非常时方现光芒
[JMX一步步来] 4、动态MBean:DynamicMBean -
fantaxy025025:
总结的不错!搜藏了。原有的链接里面内容css有问题。辛苦楼主! ...
[JMX一步步来] 1、JMX的Hello World(转) -
xuyb_0314:
非常不错~~
查看ORACLE表空间使用情况的SQL语句 -
elan1986:
谢谢 在你这里找到了
在winxp下使用bat文件运行java程序而不弹出dos窗口 -
lqw8668:
...
XP SP2下安装Rose 出现 “MEM_BAD_POINTER”错误的解决方法
一、前言
动态MBean是在运行期才定义它的属性和方法,也就是说它有什么属性和方法是可以动态改变的。动态MBean主要利用一 些辅助类(构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类 MBeanOperationInfo)来完成这个功能,所有的动态MBean必须实现DynamicMBean接口。DynamicMBean写好后, 使用方法和第一篇文章中普通的MBean一样。
给出一个动态MBean的实例,这个实例最初动态构了一个Name属性及一个print方法,当我们执行它的print方法之后,又给此MBean新增了一个print1方法。实例的代码如下:
二、实例
1、HelloDynamic类
说明:
* 实现于接口DynamicMBean
* 借助于各种辅助类完成一个类的构造。构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfo
* 这里所有public方法是实现于DynamicMBean的。主要提供:setAttribute设置属性、 getAttribute取得属性、setAttributes设置一组属性、getAttributes取得一组属性、invoke方法调用、 getMBeanInfo MBeanServer由这个方法得到关键的MBean类的构造信息。
2、HelloAgent类
前面说了HelloDynamic和普通MBean的使用方法是一样的,因此HelloAgent和第一篇的HelloAgent基本一样,就是把Hello改成HelloDynamic而已。为了实例完整,也一并帖出来吧。
3、运行
先运行HelloAgent。再打开浏览器,输入网址:http://localhost:8082/。单击进入“name=HelloDynamic ”项,执行print方法后再回到上一页面你会发现又多了一个print1方法。
4、总结
动态MBean的代码稍显复杂,但对于一些特殊需求的情况,它将显示出强大威力。而且它还是模型MBeans(Model MBeans)的基础。不过在一般的项目中,动态MBean还是用得比较少,所谓利器深藏之而不用,非常时方现光芒。
动态MBean是在运行期才定义它的属性和方法,也就是说它有什么属性和方法是可以动态改变的。动态MBean主要利用一 些辅助类(构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类 MBeanOperationInfo)来完成这个功能,所有的动态MBean必须实现DynamicMBean接口。DynamicMBean写好后, 使用方法和第一篇文章中普通的MBean一样。
给出一个动态MBean的实例,这个实例最初动态构了一个Name属性及一个print方法,当我们执行它的print方法之后,又给此MBean新增了一个print1方法。实例的代码如下:
二、实例
1、HelloDynamic类
- import java.lang.reflect.Constructor;
- import java.util.Iterator;
- import javax.management.Attribute;
- import javax.management.AttributeList;
- import javax.management.DynamicMBean;
- import javax.management.MBeanAttributeInfo;
- import javax.management.MBeanConstructorInfo;
- import javax.management.MBeanException;
- import javax.management.MBeanInfo;
- import javax.management.MBeanNotificationInfo;
- import javax.management.MBeanOperationInfo;
- import javax.management.MBeanParameterInfo;
- import javax.management.ReflectionException;
- /**
- * @author Sunny Peng
- * @author change by Chen.Gang, add a feature for dynamic add operation
- * @version 1.0
- */
- public class HelloDynamic implements DynamicMBean {
- //这是我们的属性名称
- private String name;
- private MBeanInfo mBeanInfo = null;
- private String className;
- private String description;
- private MBeanAttributeInfo[] attributes;
- private MBeanConstructorInfo[] constructors;
- private MBeanOperationInfo[] operations;
- MBeanNotificationInfo[] mBeanNotificationInfoArray;
- public HelloDynamic() {
- init();
- buildDynamicMBean();
- }
- private void init() {
- className = this.getClass().getName();
- description = "Simple implementation of a dynamic MBean.";
- attributes = new MBeanAttributeInfo[1];
- constructors = new MBeanConstructorInfo[1];
- operations = new MBeanOperationInfo[1];
- mBeanNotificationInfoArray = new MBeanNotificationInfo[0];
- }
- private void buildDynamicMBean() {
- //设定构造函数
- Constructor[] thisconstructors = this.getClass().getConstructors();
- constructors[0] = new MBeanConstructorInfo("HelloDynamic(): Constructs a HelloDynamic object", thisconstructors[0]);
- //设定一个属性
- attributes[0] = new MBeanAttributeInfo("Name", "java.lang.String", "Name: name string.", true, true, false);
- //operate method 我们的操作方法是print
- MBeanParameterInfo[] params = null;//无参数
- operations[0] = new MBeanOperationInfo("print", "print(): print the name", params, "void", MBeanOperationInfo.INFO);
- mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
- }
- //动态增加一个print1方法
- private void dynamicAddOperation() {
- init();
- operations = new MBeanOperationInfo[2];//设定数组为两个
- buildDynamicMBean();
- operations[1] = new MBeanOperationInfo("print1", "print1(): print the name", null, "void", MBeanOperationInfo.INFO);
- mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
- }
- public Object getAttribute(String attribute_name) {
- if (attribute_name != null)
- return null;
- if (attribute_name.equals("Name"))
- return name;
- return null;
- }
- public void setAttribute(Attribute attribute) {
- if (attribute == null)
- return;
- String Name = attribute.getName();
- Object value = attribute.getValue();
- try {
- if (Name.equals("Name")) {
- // if null value, try and see if the setter returns any exception
- if (value == null) {
- name = null;
- // if non null value, make sure it is assignable to the attribute
- } else if ((Class.forName("java.lang.String")).isAssignableFrom(value.getClass())) {
- name = (String) value;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public AttributeList getAttributes(String[] attributeNames) {
- if (attributeNames == null)
- return null;
- AttributeList resultList = new AttributeList();
- // if attributeNames is empty, return an empty result list
- if (attributeNames.length == 0)
- return resultList;
- for (int i = 0; i < attributeNames.length; i++) {
- try {
- Object value = getAttribute(attributeNames[i]);
- resultList.add(new Attribute(attributeNames[i], value));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return resultList;
- }
- public AttributeList setAttributes(AttributeList attributes) {
- if (attributes == null)
- return null;
- AttributeList resultList = new AttributeList();
- // if attributeNames is empty, nothing more to do
- if (attributes.isEmpty())
- return resultList;
- // for each attribute, try to set it and add to the result list if successfull
- for (Iterator i = attributes.iterator(); i.hasNext();) {
- Attribute attr = (Attribute) i.next();
- try {
- setAttribute(attr);
- String name = attr.getName();
- Object value = getAttribute(name);
- resultList.add(new Attribute(name, value));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return resultList;
- }
- public Object invoke(String operationName, Object params[], String signature[]) throws MBeanException, ReflectionException {
- // Check for a recognized operation name and call the corresponding operation
- if (operationName.equals("print")) {
- //具体实现我们的操作方法print
- System.out.println("Hello, " + name + ", this is HellDynamic!");
- dynamicAddOperation();
- return null;
- } else if (operationName.equals("print1")) {
- System.out.println("这是动态增加的一方法print1");
- return null;
- } else {
- // unrecognized operation name:
- throw new ReflectionException(new NoSuchMethodException(operationName), "Cannot find the operation " + operationName + " in " + className);
- }
- }
- public MBeanInfo getMBeanInfo() {
- return mBeanInfo;
- }
- }
* 实现于接口DynamicMBean
* 借助于各种辅助类完成一个类的构造。构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfo
* 这里所有public方法是实现于DynamicMBean的。主要提供:setAttribute设置属性、 getAttribute取得属性、setAttributes设置一组属性、getAttributes取得一组属性、invoke方法调用、 getMBeanInfo MBeanServer由这个方法得到关键的MBean类的构造信息。
2、HelloAgent类
前面说了HelloDynamic和普通MBean的使用方法是一样的,因此HelloAgent和第一篇的HelloAgent基本一样,就是把Hello改成HelloDynamic而已。为了实例完整,也一并帖出来吧。
- import javax.management.MBeanServerFactory;
- import javax.management.ObjectName;
- 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=HelloDynamic");
- HelloDynamic hello = new HelloDynamic();
- 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.....");
- }
- }
3、运行
先运行HelloAgent。再打开浏览器,输入网址:http://localhost:8082/。单击进入“name=HelloDynamic ”项,执行print方法后再回到上一页面你会发现又多了一个print1方法。
4、总结
动态MBean的代码稍显复杂,但对于一些特殊需求的情况,它将显示出强大威力。而且它还是模型MBeans(Model MBeans)的基础。不过在一般的项目中,动态MBean还是用得比较少,所谓利器深藏之而不用,非常时方现光芒。
发表评论
-
web.xml里<filter-mapping>中的<dispatcher>作用
2009-12-08 17:20 11219在2.4版本的servlet规范在部属描述符中新增加 ... -
(转)Taglib部署的三种方式
2009-12-04 13:07 0本周,由于项目的需要引入了jstl,但是在jsp页 ... -
Iframe页面请求跳转问题解决
2009-11-04 21:15 5234问题描述: 在父页面的一个Iframe页面中,提交请求后 ... -
JAF简介
2009-11-01 21:05 2557JAF全称是JavaBeans ... -
是 String , StringBuffer 还是 StringBuilder ?
2009-10-18 15:42 1424相信大家对 String 和 StringBuffer 的区别 ... -
选择Java接口还是抽象类
2009-10-17 16:23 3491关于java接口与 ... -
Java接口与Java抽象类的区别
2009-10-17 16:01 1413Java接口与Java抽象类的区别: 1. Java抽 ... -
为何不能通过返回值来区分重载方法?
2009-06-28 16:20 3092在java中,重载是其一个非常重要的特性。使用重载,我 ... -
怎么处理警告:编码 GBK 的不可映射字符
2009-04-17 01:31 3061在使用ant编译代码时提示 “编码 GBK 的不可映射字 ... -
既然认为它是好的,就要发挥到极限-系列之二单元测试
2009-03-29 17:07 958(原文)http://www.blogjava.net ... -
weblogic10 下对jVM性能调优设置(参考资料)
2009-03-25 12:36 2906对 JRockit JVM优化 Ta ... -
lazy initialization实现Singleton时synchronized的必要性
2009-03-19 21:48 2468首先了解一下Singleton模式通常的两种表现形式: 第一种 ... -
Guidelines, Patterns, and Code for End-to-End Java
2009-02-02 13:45 1057This document contains recomm ... -
poi即将提供对OOXML的支持
2008-11-06 23:18 9176POI是apache项目之一,最新版是3.2,它提 ... -
JSP在Servlet中的几个编码的作用及原理
2008-10-05 11:27 1609首先,说说JSP/Ser ... -
使用jconsole监控Apusic
2008-08-19 10:39 1599JDK 1.5+提供了jconsole工具,可以对JVM实例的 ... -
jconsole+tomcat配置说明(基于jdk5.0)
2008-08-18 23:18 8569最近需要参与一些java程 ... -
CruiseControl配置文档元素详解
2008-07-31 22:16 0<cruisecontrol> & ... -
抽象类和接口的区别
2008-07-26 20:19 1049在Java语言中, abstract class ... -
十个最好的Java性能故障排除工具
2008-07-21 13:00 1445推荐十个最好的Java性能故障排除工具: 1.jconsole ...
相关推荐
JMX不仅用于JVM监控,还可以用于日志级别的动态修改,例如log4j支持通过JMX来动态调整日志级别。此外,许多监控工具,如Spring Boot Actuator、JConsole、VisualVM等,都利用了JMX来收集和展示应用的运行时信息。 ...
Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备等资源。在JDK1.6版本中,JMX已经成熟并被广泛使用。本篇文章将深入探讨JMX的基本概念、核心组件、功能...
总之,"基于Spring+JMX+Tomcat实现资源动态管理"是一个强大的技术组合,它为开发者提供了强大的工具来监控和调整应用程序和服务器的运行状态。通过了解和掌握这些技术,我们可以构建出更加灵活、可扩展且易于维护的...
JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理...JMX框架提供了一种灵活、可扩展和高效的方式来管理和监控应用程序,而RMI连接方式允许远程客户端访问MBean提供的管理功能。
在本实例中,我们重点关注的是如何使用Remote Method Invocation(RMI)来实现JMX的MBean管理。RMI是一种在Java平台上进行远程调用的技术,使得一个Java对象的方法可以在不同的Java虚拟机(JVM)之间被调用。结合JMX...
Description Resource Path Location Type Missing artifact com.sun.jmx:jmxri:jar:1.2.1 pom.xml /eshop-storm line 2 Maven Dependency Problem
Java Management Extensions(JMX)是Java平台上的一个标准管理框架,它允许开发人员创建、注册和管理名为MBeans(Managed Beans)的对象,这些对象代表了系统、应用程序或服务的可管理资源。通过JMX,我们可以远程...
总的来说,JMX和MBean Server提供了一种标准、灵活的管理方式,使得Java应用的管理和监控变得更加便捷。通过结合Spring框架,开发者可以更轻松地在应用中集成JMX功能,实现对应用的全方位管理。
3. 开放MBean:开放MBean是一种特殊的动态MBean,它的属性和操作都遵循一种标准的数据类型,这使得它们可以被任何支持JMX的管理工具所识别和操作。 在JMX中,MBean的注册和管理通常由MBean服务器(MBeanServer)...
Java Management Extensions (JMX) 是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备。`jmxri-1.2.1.jar` 和 `jmxtools-1.2.1.jar` 是与JMX相关的两个核心库文件,它们在Java应用程序中扮演...
在本章"JMX IN ACTION(五)"中,我们将探讨如何使用动态MBean(Dynamic MBean)来管理那些经常变化或具有不确定接口的资源。动态MBean是针对那些管理接口需要在运行时自定义和调整的情况的理想选择。与标准MBean不同...
在这个“jmx简单实例”中,我们将会探讨JMX的基本概念,以及如何使用所提供的jar包来构建和运行一个简单的JMX示例。 1. **JMX基础** JMX由三部分组成:MBeans(Managed Beans)、Servers和Agents。MBeans代表管理...
4. 模型MBean:允许在运行时动态地添加、删除和修改属性和操作。 一个MBean实例通常与一个MBean服务器一起工作,MBean服务器作为MBean的容器,负责管理这些MBean实例的生命周期,以及管理这些MBean实例与外界(例如...
MBean可以是任何Java对象,它暴露了一组操作和属性,允许管理者通过JMX代理进行交互。MBeans可以通过MBeanServer注册,然后可以通过JMX连接器进行访问,实现对应用程序的监控和管理。 OSGi则是一个动态模块系统,它...
NULL 博文链接:https://jonerxq.iteye.com/blog/1990872
2. **动态MBean**:动态MBean不强制实现特定的MBean接口,而是实现`DynamicMBean`接口,它提供了运行时动态暴露属性和操作的能力。 3. **模型MBean**:模型MBean通过元数据描述其属性、操作和通知,这样可以更灵活...
MBean是一个被管理的Java对象,就像Javabean组件一样,但是它遵从JMX规范的设计模式。MBean可以表示设备、应用或者任何需要被管理的资源。MBeans暴露如下管理接口:1.一组可读和可写属性,或者两者兼而有之。2.一组...
- 使用MBeanserver:MBean服务器是JMX的核心,负责管理MBean并提供API来操作它们。 - 连接和交互:通过JMX连接器,客户端可以连接到MBean服务器,并通过查询、调用操作或设置属性来管理MBean。 在实际应用中,JMX...
【JMX学习——一步步来】 JMX,全称为Java Management Extensions,是一个用于植入管理功能到Java应用程序的框架。它提供了一套标准的接口和服务,使得开发者可以在任何Java应用中实现管理和监控。对于初学者来说,...