- 浏览: 152683 次
- 性别:
- 来自: 北京
-
最新评论
-
pandengzhegt:
好牛!正需要!谢谢了!
JPA 2.0 中的动态类型安全查询 -
yanlp:
万分的感谢。
仿google 的输入提示框 -
huangwenji6111:
可谓良师,在此拜谢!受益匪浅!
hibernate lazy -
jwx0925:
不错!mark!
hibernate对象状态 -
leftstick:
大有裨益,谢了!
hibernate lazy
一、前言
动态MBean是在运行期才定义它的属性和方法,也就是说它有什么属性和方法是可以动态改变的。动态MBean主要利用一 些辅助类(构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类 MBeanOperationInfo)来完成这个功能,所有的动态MBean必须实现DynamicMBean接口。DynamicMBean写好后, 使用方法和第一篇文章中普通的MBean一样。
给出一个动态MBean的实例,这个实例最初动态构了一个Name属性及一个print方法,当我们执行它的print方法之后,又给此MBean新增了一个print1方法。实例的代码如下:
二、实例
1、HelloDynamic类
1.import java.lang.reflect.Constructor;
2.import java.util.Iterator;
3.import javax.management.Attribute;
4.import javax.management.AttributeList;
5.import javax.management.DynamicMBean;
6.import javax.management.MBeanAttributeInfo;
7.import javax.management.MBeanConstructorInfo;
8.import javax.management.MBeanException;
9.import javax.management.MBeanInfo;
10.import javax.management.MBeanNotificationInfo;
11.import javax.management.MBeanOperationInfo;
12.import javax.management.MBeanParameterInfo;
13.import javax.management.ReflectionException;
14.
15./**
16. * @author Sunny Peng
17. * @author change by Chen.Gang, add a feature for dynamic add operation
18. * @version 1.0
19. */
20.public class HelloDynamic implements DynamicMBean {
21. //这是我们的属性名称
22. private String name;
23. private MBeanInfo mBeanInfo = null;
24. private String className;
25. private String description;
26. private MBeanAttributeInfo[] attributes;
27. private MBeanConstructorInfo[] constructors;
28. private MBeanOperationInfo[] operations;
29. MBeanNotificationInfo[] mBeanNotificationInfoArray;
30.
31. public HelloDynamic() {
32. init();
33. buildDynamicMBean();
34. }
35.
36. private void init() {
37. className = this.getClass().getName();
38. description = "Simple implementation of a dynamic MBean.";
39. attributes = new MBeanAttributeInfo[1];
40. constructors = new MBeanConstructorInfo[1];
41. operations = new MBeanOperationInfo[1];
42. mBeanNotificationInfoArray = new MBeanNotificationInfo[0];
43. }
44.
45. private void buildDynamicMBean() {
46. //设定构造函数
47. Constructor[] thisconstructors = this.getClass().getConstructors();
48. constructors[0] = new MBeanConstructorInfo("HelloDynamic(): Constructs a HelloDynamic object", thisconstructors[0]);
49. //设定一个属性
50. attributes[0] = new MBeanAttributeInfo("Name", "java.lang.String", "Name: name string.", true, true, false);
51. //operate method 我们的操作方法是print
52. MBeanParameterInfo[] params = null;//无参数
53. operations[0] = new MBeanOperationInfo("print", "print(): print the name", params, "void", MBeanOperationInfo.INFO);
54. mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
55. }
56.
57. //动态增加一个print1方法
58. private void dynamicAddOperation() {
59. init();
60. operations = new MBeanOperationInfo[2];//设定数组为两个
61. buildDynamicMBean();
62. operations[1] = new MBeanOperationInfo("print1", "print1(): print the name", null, "void", MBeanOperationInfo.INFO);
63. mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
64. }
65.
66. public Object getAttribute(String attribute_name) {
67. if (attribute_name != null)
68. return null;
69. if (attribute_name.equals("Name"))
70. return name;
71. return null;
72. }
73.
74. public void setAttribute(Attribute attribute) {
75. if (attribute == null)
76. return;
77. String Name = attribute.getName();
78. Object value = attribute.getValue();
79. try {
80. if (Name.equals("Name")) {
81. // if null value, try and see if the setter returns any exception
82. if (value == null) {
83. name = null;
84. // if non null value, make sure it is assignable to the attribute
85. } else if ((Class.forName("java.lang.String")).isAssignableFrom(value.getClass())) {
86. name = (String) value;
87. }
88. }
89. } catch (Exception e) {
90. e.printStackTrace();
91. }
92. }
93.
94. public AttributeList getAttributes(String[] attributeNames) {
95. if (attributeNames == null)
96. return null;
97. AttributeList resultList = new AttributeList();
98. // if attributeNames is empty, return an empty result list
99. if (attributeNames.length == 0)
100. return resultList;
101. for (int i = 0; i < attributeNames.length; i++) {
102. try {
103. Object value = getAttribute(attributeNames[i]);
104. resultList.add(new Attribute(attributeNames[i], value));
105. } catch (Exception e) {
106. e.printStackTrace();
107. }
108. }
109. return resultList;
110. }
111.
112. public AttributeList setAttributes(AttributeList attributes) {
113. if (attributes == null)
114. return null;
115. AttributeList resultList = new AttributeList();
116. // if attributeNames is empty, nothing more to do
117. if (attributes.isEmpty())
118. return resultList;
119. // for each attribute, try to set it and add to the result list if successfull
120. for (Iterator i = attributes.iterator(); i.hasNext();) {
121. Attribute attr = (Attribute) i.next();
122. try {
123. setAttribute(attr);
124. String name = attr.getName();
125. Object value = getAttribute(name);
126. resultList.add(new Attribute(name, value));
127. } catch (Exception e) {
128. e.printStackTrace();
129. }
130. }
131. return resultList;
132. }
133.
134. public Object invoke(String operationName, Object params[], String signature[]) throws MBeanException, ReflectionException {
135. // Check for a recognized operation name and call the corresponding operation
136. if (operationName.equals("print")) {
137. //具体实现我们的操作方法print
138. System.out.println("Hello, " + name + ", this is HellDynamic!");
139. dynamicAddOperation();
140. return null;
141. } else if (operationName.equals("print1")) {
142. System.out.println("这是动态增加的一方法print1");
143. return null;
144. } else {
145. // unrecognized operation name:
146. throw new ReflectionException(new NoSuchMethodException(operationName), "Cannot find the operation " + operationName + " in " + className);
147. }
148.
149. }
150.
151. public MBeanInfo getMBeanInfo() {
152. return mBeanInfo;
153. }
154.}
说明:
* 实现于接口DynamicMBean
* 借助于各种辅助类完成一个类的构造。构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfo
* 这里所有public方法是实现于DynamicMBean的。主要提供:setAttribute设置属性、 getAttribute取得属性、setAttributes设置一组属性、getAttributes取得一组属性、invoke方法调用、 getMBeanInfo MBeanServer由这个方法得到关键的MBean类的构造信息。
2、HelloAgent类
前面说了HelloDynamic和普通MBean的使用方法是一样的,因此HelloAgent和第一篇的HelloAgent基本一样,就是把Hello改成HelloDynamic而已。为了实例完整,也一并帖出来吧。
1.import javax.management.MBeanServerFactory;
2.import javax.management.ObjectName;
3.import com.sun.jdmk.comm.HtmlAdaptorServer;
4.public class HelloAgent {
5. public static void main(String[] args) throws Exception {
6. MBeanServer server = MBeanServerFactory.createMBeanServer();
7. ObjectName helloName = new ObjectName("chengang:name=HelloDynamic");
8. HelloDynamic hello = new HelloDynamic();
9. server.registerMBean(hello, helloName);
10. ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
11. HtmlAdaptorServer adapter = new HtmlAdaptorServer();
12. server.registerMBean(adapter, adapterName);
13. adapter.start();
14. System.out.println("start.....");
15. }
16.}
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类
1.import java.lang.reflect.Constructor;
2.import java.util.Iterator;
3.import javax.management.Attribute;
4.import javax.management.AttributeList;
5.import javax.management.DynamicMBean;
6.import javax.management.MBeanAttributeInfo;
7.import javax.management.MBeanConstructorInfo;
8.import javax.management.MBeanException;
9.import javax.management.MBeanInfo;
10.import javax.management.MBeanNotificationInfo;
11.import javax.management.MBeanOperationInfo;
12.import javax.management.MBeanParameterInfo;
13.import javax.management.ReflectionException;
14.
15./**
16. * @author Sunny Peng
17. * @author change by Chen.Gang, add a feature for dynamic add operation
18. * @version 1.0
19. */
20.public class HelloDynamic implements DynamicMBean {
21. //这是我们的属性名称
22. private String name;
23. private MBeanInfo mBeanInfo = null;
24. private String className;
25. private String description;
26. private MBeanAttributeInfo[] attributes;
27. private MBeanConstructorInfo[] constructors;
28. private MBeanOperationInfo[] operations;
29. MBeanNotificationInfo[] mBeanNotificationInfoArray;
30.
31. public HelloDynamic() {
32. init();
33. buildDynamicMBean();
34. }
35.
36. private void init() {
37. className = this.getClass().getName();
38. description = "Simple implementation of a dynamic MBean.";
39. attributes = new MBeanAttributeInfo[1];
40. constructors = new MBeanConstructorInfo[1];
41. operations = new MBeanOperationInfo[1];
42. mBeanNotificationInfoArray = new MBeanNotificationInfo[0];
43. }
44.
45. private void buildDynamicMBean() {
46. //设定构造函数
47. Constructor[] thisconstructors = this.getClass().getConstructors();
48. constructors[0] = new MBeanConstructorInfo("HelloDynamic(): Constructs a HelloDynamic object", thisconstructors[0]);
49. //设定一个属性
50. attributes[0] = new MBeanAttributeInfo("Name", "java.lang.String", "Name: name string.", true, true, false);
51. //operate method 我们的操作方法是print
52. MBeanParameterInfo[] params = null;//无参数
53. operations[0] = new MBeanOperationInfo("print", "print(): print the name", params, "void", MBeanOperationInfo.INFO);
54. mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
55. }
56.
57. //动态增加一个print1方法
58. private void dynamicAddOperation() {
59. init();
60. operations = new MBeanOperationInfo[2];//设定数组为两个
61. buildDynamicMBean();
62. operations[1] = new MBeanOperationInfo("print1", "print1(): print the name", null, "void", MBeanOperationInfo.INFO);
63. mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
64. }
65.
66. public Object getAttribute(String attribute_name) {
67. if (attribute_name != null)
68. return null;
69. if (attribute_name.equals("Name"))
70. return name;
71. return null;
72. }
73.
74. public void setAttribute(Attribute attribute) {
75. if (attribute == null)
76. return;
77. String Name = attribute.getName();
78. Object value = attribute.getValue();
79. try {
80. if (Name.equals("Name")) {
81. // if null value, try and see if the setter returns any exception
82. if (value == null) {
83. name = null;
84. // if non null value, make sure it is assignable to the attribute
85. } else if ((Class.forName("java.lang.String")).isAssignableFrom(value.getClass())) {
86. name = (String) value;
87. }
88. }
89. } catch (Exception e) {
90. e.printStackTrace();
91. }
92. }
93.
94. public AttributeList getAttributes(String[] attributeNames) {
95. if (attributeNames == null)
96. return null;
97. AttributeList resultList = new AttributeList();
98. // if attributeNames is empty, return an empty result list
99. if (attributeNames.length == 0)
100. return resultList;
101. for (int i = 0; i < attributeNames.length; i++) {
102. try {
103. Object value = getAttribute(attributeNames[i]);
104. resultList.add(new Attribute(attributeNames[i], value));
105. } catch (Exception e) {
106. e.printStackTrace();
107. }
108. }
109. return resultList;
110. }
111.
112. public AttributeList setAttributes(AttributeList attributes) {
113. if (attributes == null)
114. return null;
115. AttributeList resultList = new AttributeList();
116. // if attributeNames is empty, nothing more to do
117. if (attributes.isEmpty())
118. return resultList;
119. // for each attribute, try to set it and add to the result list if successfull
120. for (Iterator i = attributes.iterator(); i.hasNext();) {
121. Attribute attr = (Attribute) i.next();
122. try {
123. setAttribute(attr);
124. String name = attr.getName();
125. Object value = getAttribute(name);
126. resultList.add(new Attribute(name, value));
127. } catch (Exception e) {
128. e.printStackTrace();
129. }
130. }
131. return resultList;
132. }
133.
134. public Object invoke(String operationName, Object params[], String signature[]) throws MBeanException, ReflectionException {
135. // Check for a recognized operation name and call the corresponding operation
136. if (operationName.equals("print")) {
137. //具体实现我们的操作方法print
138. System.out.println("Hello, " + name + ", this is HellDynamic!");
139. dynamicAddOperation();
140. return null;
141. } else if (operationName.equals("print1")) {
142. System.out.println("这是动态增加的一方法print1");
143. return null;
144. } else {
145. // unrecognized operation name:
146. throw new ReflectionException(new NoSuchMethodException(operationName), "Cannot find the operation " + operationName + " in " + className);
147. }
148.
149. }
150.
151. public MBeanInfo getMBeanInfo() {
152. return mBeanInfo;
153. }
154.}
说明:
* 实现于接口DynamicMBean
* 借助于各种辅助类完成一个类的构造。构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfo
* 这里所有public方法是实现于DynamicMBean的。主要提供:setAttribute设置属性、 getAttribute取得属性、setAttributes设置一组属性、getAttributes取得一组属性、invoke方法调用、 getMBeanInfo MBeanServer由这个方法得到关键的MBean类的构造信息。
2、HelloAgent类
前面说了HelloDynamic和普通MBean的使用方法是一样的,因此HelloAgent和第一篇的HelloAgent基本一样,就是把Hello改成HelloDynamic而已。为了实例完整,也一并帖出来吧。
1.import javax.management.MBeanServerFactory;
2.import javax.management.ObjectName;
3.import com.sun.jdmk.comm.HtmlAdaptorServer;
4.public class HelloAgent {
5. public static void main(String[] args) throws Exception {
6. MBeanServer server = MBeanServerFactory.createMBeanServer();
7. ObjectName helloName = new ObjectName("chengang:name=HelloDynamic");
8. HelloDynamic hello = new HelloDynamic();
9. server.registerMBean(hello, helloName);
10. ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
11. HtmlAdaptorServer adapter = new HtmlAdaptorServer();
12. server.registerMBean(adapter, adapterName);
13. adapter.start();
14. System.out.println("start.....");
15. }
16.}
3、运行
先运行HelloAgent。再打开浏览器,输入网址:http://localhost:8082/。单击进入“name=HelloDynamic ”项,执行print方法后再回到上一页面你会发现又多了一个print1方法。
4、总结
动态MBean的代码稍显复杂,但对于一些特殊需求的情况,它将显示出强大威力。而且它还是模型MBeans(Model MBeans)的基础。不过在一般的项目中,动态MBean还是用得比较少,所谓利器深藏之而不用,非常时方现光芒。
发表评论
-
java实现Tree
2012-07-10 09:59 893/****************************** ... -
Java正则表达式应用总结
2012-05-25 12:23 1117一、概述 正则表达式是Java处理字符串、文本的重要工具。 ... -
JdbcTemplate与事务
2012-05-17 17:42 1131JdbcTemplate与事务 上例中的JdbcTemplat ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-05-09 17:59 938最近的机器内存又爆满 ... -
jconsole远程监控Java进程
2012-05-07 11:44 1082JDK中的工具jconsole可以很好地监控Java进程及其运 ... -
spring集成quartz
2012-04-16 15:56 2233首先,让spring框架运转起来,可以参看一下:ht ... -
JMX RMI 访问
2011-09-02 10:46 4542RMI(Remote Method Invocation) R ... -
采用开发框架quartz调度管理Job
2011-07-11 10:03 19781.所需要的第三方包:quartz-1.5.2.jarcom ... -
java类型转换
2011-05-20 17:13 929string和int之间的转换? 字符串转换成数据 ... -
java整型数与网络字节序的 byte[] 数组转换关系
2011-05-05 10:47 3795因工作需要在java和c/c++之间进行socket通信,而 ... -
线程安全总结(二)
2010-11-12 10:34 858站内很多人都问我,所谓线程的“工作内存”到底是个什么东西? ... -
java线程安全总结
2010-11-12 10:33 844java线程安全总结(二 ... -
ora-02289问题解决
2010-10-19 12:35 1670<id name="id" type ... -
JDBC的批处理操作三种方式 pstmt.addBatch();
2010-09-25 15:58 8738SQL批处理是JDBC性能优化的重要武器,经本人研究总结,批处 ... -
log4j输出多个自定义日志文件
2010-05-12 10:28 1524<转>http://hi.baidu.com/ ... -
spring任务调度
2010-04-28 09:48 1423概述 在JDK 1.3以后的版本中,Java通过java.ut ... -
JDK线程池的使用
2010-04-07 16:35 1470一、简介 线程池类为 j ... -
Java文件操作
2010-02-06 15:29 880本文汇集常用文件操作方法,包括文件的建立/检查与删除,目录的建 ... -
[JMX一步步来] 6、Model Bean
2009-12-21 11:46 1218在上一节是用apache的commons-modeler来 ... -
[JMX一步步来] 5、用Apache的commons-modeler来辅助开发JMX
2009-12-21 11:45 1089一、前言 每一个MBean都要有一个接口,比如前面的Hello ...
相关推荐
2. **监控与诊断**:JMX提供了一种机制来收集有关应用程序的运行时信息,包括但不限于内存使用情况、线程统计信息等,有助于开发者进行故障排查。 3. **自动化管理**:利用JMX,可以编写脚本或者工具来自动生成报告...
JMX不仅用于JVM监控,还可以用于日志级别的动态修改,例如log4j支持通过JMX来动态调整日志级别。此外,许多监控工具,如Spring Boot Actuator、JConsole、VisualVM等,都利用了JMX来收集和展示应用的运行时信息。 ...
JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理...JMX框架提供了一种灵活、可扩展和高效的方式来管理和监控应用程序,而RMI连接方式允许远程客户端访问MBean提供的管理功能。
Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备等资源。在JDK1.6版本中,JMX已经成熟并被广泛使用。本篇文章将深入探讨JMX的基本概念、核心组件、功能...
总之,"基于Spring+JMX+Tomcat实现资源动态管理"是一个强大的技术组合,它为开发者提供了强大的工具来监控和调整应用程序和服务器的运行状态。通过了解和掌握这些技术,我们可以构建出更加灵活、可扩展且易于维护的...
在本实例中,我们重点关注的是如何使用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应用中实现管理和监控。对于初学者来说,...