- 浏览: 151271 次
- 性别:
- 来自: 北京
最新评论
-
pandengzhegt:
好牛!正需要!谢谢了!
JPA 2.0 中的动态类型安全查询 -
yanlp:
万分的感谢。
仿google 的输入提示框 -
huangwenji6111:
可谓良师,在此拜谢!受益匪浅!
hibernate lazy -
jwx0925:
不错!mark!
hibernate对象状态 -
leftstick:
大有裨益,谢了!
hibernate lazy
在上一节是用apache的commons-modeler来开发的一个model,只不过commons-modeler帮助我们实现了很多的代码,而 我们只需要写描述XML文件就行了。这一节,来一个实打实的Model Bean,不借助任何第三方工具包。例子还是沿用Hello这个类,以便于和以前的实现相比较。
一、Model MBean实例
1、Hello.java还是和以前的一样。这里它没有再加上一个MBean接口了,只是一个很普通的类
1.public class Hello{
2. private String name;
3. public String getName() {
4. return name;
5. }
6. public void setName(String name) {
7. this.name = name;
8. }
9. public void printHello() {
10. System.out.println("Hello World, " + name);
11. }
12. public void printHello(String whoName) {
13. System.out.println("Hello , " + whoName);
14. }
15.}
2、接下来是HelloAgent的写法,和以前就差一句:把“new Hello()”这一句删除了,加上了ModelMbeanUtils.createModlerMbean();
1.import javax.management.MBeanServer;
2.import javax.management.MBeanServerFactory;
3.import javax.management.ObjectName;
4.import javax.management.modelmbean.RequiredModelMBean;
5.
6.import com.sun.jdmk.comm.HtmlAdaptorServer;
7.
8.public class HelloAgent {
9. public static void main(String[] args) throws Exception {
10. MBeanServer server = MBeanServerFactory.createMBeanServer();
11. ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
12. //Hello hello = new Hello();
13. RequiredModelMBean hello = ModelMBeanUtils.createModlerMBean();
14. server.registerMBean(hello, helloName);
15. ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
16. HtmlAdaptorServer adapter = new HtmlAdaptorServer();
17. server.registerMBean(adapter, adapterName);
18. adapter.start();
19. System.out.println("start.....");
20. }
21.}
3、ModelMbeanUtils这个类是要我们自己来实现的,也是写model Bean最麻烦的地方,它主要是返回一个RequiredModelMBean类,此类主要包括了一个ModelMBeanInfo类的信息。在 ModelMBeanInfo中定义了所有对需要管理的属性和方法的描述。具体代码如下:
1.import javax.management.MBeanParameterInfo;
2.import javax.management.modelmbean.ModelMBeanAttributeInfo;
3.import javax.management.modelmbean.ModelMBeanInfo;
4.import javax.management.modelmbean.ModelMBeanInfoSupport;
5.import javax.management.modelmbean.ModelMBeanOperationInfo;
6.import javax.management.modelmbean.RequiredModelMBean;
7.public class ModelMBeanUtils {
8. private static final boolean READABLE = true;
9. private static final boolean WRITABLE = true;
10. private static final boolean BOOLEAN = true;
11. private static final String STRING_CLASS = "java.lang.String";
12. public static RequiredModelMBean createModlerMBean() {
13. RequiredModelMBean model = null;
14. try {
15. model = new RequiredModelMBean();
16. model.setManagedResource(new Hello(), "objectReference");
17. ModelMBeanInfo info = createModelMBeanInfo();
18. model.setModelMBeanInfo(info);
19. } catch (Exception e) {
20. e.printStackTrace();
21. }
22. return model;
23. }
24. private static ModelMBeanInfo createModelMBeanInfo() {
25. //////////////////////////////////////////////////////////////////
26. // 属性 //
27. //////////////////////////////////////////////////////////////////
28. // 构造name属性信息
29. ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
30. "Name", // 属性名
31. STRING_CLASS, //属性类型
32. "people name", // 描述文字
33. READABLE, WRITABLE, !BOOLEAN, // 读写
34. null // 属性描述子
35. );
36. //////////////////////////////////////////////////////////////////
37. // 方法 //
38. //////////////////////////////////////////////////////////////////
39. //构造 printHello()操作的信息
40. ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//
41. "printHello", //
42. null, //
43. null, //
44. "void", //
45. MBeanOperationInfo.INFO, //
46. null //
47. );
48. // 构造printHello(String whoName)操作信息
49. ModelMBeanOperationInfo print2Info;
50. MBeanParameterInfo[] param2 = new MBeanParameterInfo[1];
51. param2[0] = new MBeanParameterInfo("whoName", STRING_CLASS, "say hello to who");
52. print2Info = new ModelMBeanOperationInfo(//
53. "printHello", //
54. null,//
55. param2,//
56. "void", //
57. MBeanOperationInfo.INFO, //
58. null//
59. );
60. //////////////////////////////////////////////////////////////////
61. // 最后总合 //
62. //////////////////////////////////////////////////////////////////
63. // create ModelMBeanInfo
64. ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
65. RequiredModelMBean.class.getName(), // MBean类
66. null, // 描述文字
67. new ModelMBeanAttributeInfo[] { // 所有的属性信息(数组)
68. nameAttrInfo },//只有一个属性
69. null, // 所有的构造函数信息
70. new ModelMBeanOperationInfo[] { // 所有的操作信息(数组)
71. print1Info,
72. print2Info },//
73. null, // 所有的通知信息(本例无)
74. null//MBean描述子
75. );
76. return mbeanInfo;
77. }
78.}
4、看效果的方法和以前一样,运行HelloAgent,用浏览器打开:http://localhost:8082 。效果图和standard mbean一样
二、总结
我们发现模型Mbean(Model MBean)要比标准MBean(standard mbean)复杂多了,那有什么理由让我们选择使用模型MBean吗?我认为,最大的理由就是模型MBean可以动态配置。试想一下这个应用场景:由于安 全或其他原因,系统要把某个MBean公开的可管理方法隐藏起来。这时,如果你是用标准MBean,这需要修改接口类,然后重新编译发布;如果用 Apache commons-modeler来写的模型MBean,则只需要修改XML文件就行了,不需要重新编译发布(可能要重启一下系统)。这就是模型Mbean 优势之所在了。
细心的人会发现动态MBean和这一节的模型Mbean非常相似,但它们还是有很大不同的:动态MBean没有Hello类,它要自己实现Hello类中的方法逻辑。
这里有个问题:
MBean的属性Name是可读写的,就是说可以对Name进行赋值,但是在运行的界面中对Name赋值后,调用print1Info打印出的信息是"Hello World, null",说明Name属性并没有赋值,不知道该如何正确操作才能正确对Name赋值。
一、Model MBean实例
1、Hello.java还是和以前的一样。这里它没有再加上一个MBean接口了,只是一个很普通的类
1.public class Hello{
2. private String name;
3. public String getName() {
4. return name;
5. }
6. public void setName(String name) {
7. this.name = name;
8. }
9. public void printHello() {
10. System.out.println("Hello World, " + name);
11. }
12. public void printHello(String whoName) {
13. System.out.println("Hello , " + whoName);
14. }
15.}
2、接下来是HelloAgent的写法,和以前就差一句:把“new Hello()”这一句删除了,加上了ModelMbeanUtils.createModlerMbean();
1.import javax.management.MBeanServer;
2.import javax.management.MBeanServerFactory;
3.import javax.management.ObjectName;
4.import javax.management.modelmbean.RequiredModelMBean;
5.
6.import com.sun.jdmk.comm.HtmlAdaptorServer;
7.
8.public class HelloAgent {
9. public static void main(String[] args) throws Exception {
10. MBeanServer server = MBeanServerFactory.createMBeanServer();
11. ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
12. //Hello hello = new Hello();
13. RequiredModelMBean hello = ModelMBeanUtils.createModlerMBean();
14. server.registerMBean(hello, helloName);
15. ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
16. HtmlAdaptorServer adapter = new HtmlAdaptorServer();
17. server.registerMBean(adapter, adapterName);
18. adapter.start();
19. System.out.println("start.....");
20. }
21.}
3、ModelMbeanUtils这个类是要我们自己来实现的,也是写model Bean最麻烦的地方,它主要是返回一个RequiredModelMBean类,此类主要包括了一个ModelMBeanInfo类的信息。在 ModelMBeanInfo中定义了所有对需要管理的属性和方法的描述。具体代码如下:
1.import javax.management.MBeanParameterInfo;
2.import javax.management.modelmbean.ModelMBeanAttributeInfo;
3.import javax.management.modelmbean.ModelMBeanInfo;
4.import javax.management.modelmbean.ModelMBeanInfoSupport;
5.import javax.management.modelmbean.ModelMBeanOperationInfo;
6.import javax.management.modelmbean.RequiredModelMBean;
7.public class ModelMBeanUtils {
8. private static final boolean READABLE = true;
9. private static final boolean WRITABLE = true;
10. private static final boolean BOOLEAN = true;
11. private static final String STRING_CLASS = "java.lang.String";
12. public static RequiredModelMBean createModlerMBean() {
13. RequiredModelMBean model = null;
14. try {
15. model = new RequiredModelMBean();
16. model.setManagedResource(new Hello(), "objectReference");
17. ModelMBeanInfo info = createModelMBeanInfo();
18. model.setModelMBeanInfo(info);
19. } catch (Exception e) {
20. e.printStackTrace();
21. }
22. return model;
23. }
24. private static ModelMBeanInfo createModelMBeanInfo() {
25. //////////////////////////////////////////////////////////////////
26. // 属性 //
27. //////////////////////////////////////////////////////////////////
28. // 构造name属性信息
29. ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
30. "Name", // 属性名
31. STRING_CLASS, //属性类型
32. "people name", // 描述文字
33. READABLE, WRITABLE, !BOOLEAN, // 读写
34. null // 属性描述子
35. );
36. //////////////////////////////////////////////////////////////////
37. // 方法 //
38. //////////////////////////////////////////////////////////////////
39. //构造 printHello()操作的信息
40. ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//
41. "printHello", //
42. null, //
43. null, //
44. "void", //
45. MBeanOperationInfo.INFO, //
46. null //
47. );
48. // 构造printHello(String whoName)操作信息
49. ModelMBeanOperationInfo print2Info;
50. MBeanParameterInfo[] param2 = new MBeanParameterInfo[1];
51. param2[0] = new MBeanParameterInfo("whoName", STRING_CLASS, "say hello to who");
52. print2Info = new ModelMBeanOperationInfo(//
53. "printHello", //
54. null,//
55. param2,//
56. "void", //
57. MBeanOperationInfo.INFO, //
58. null//
59. );
60. //////////////////////////////////////////////////////////////////
61. // 最后总合 //
62. //////////////////////////////////////////////////////////////////
63. // create ModelMBeanInfo
64. ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
65. RequiredModelMBean.class.getName(), // MBean类
66. null, // 描述文字
67. new ModelMBeanAttributeInfo[] { // 所有的属性信息(数组)
68. nameAttrInfo },//只有一个属性
69. null, // 所有的构造函数信息
70. new ModelMBeanOperationInfo[] { // 所有的操作信息(数组)
71. print1Info,
72. print2Info },//
73. null, // 所有的通知信息(本例无)
74. null//MBean描述子
75. );
76. return mbeanInfo;
77. }
78.}
4、看效果的方法和以前一样,运行HelloAgent,用浏览器打开:http://localhost:8082 。效果图和standard mbean一样
二、总结
我们发现模型Mbean(Model MBean)要比标准MBean(standard mbean)复杂多了,那有什么理由让我们选择使用模型MBean吗?我认为,最大的理由就是模型MBean可以动态配置。试想一下这个应用场景:由于安 全或其他原因,系统要把某个MBean公开的可管理方法隐藏起来。这时,如果你是用标准MBean,这需要修改接口类,然后重新编译发布;如果用 Apache commons-modeler来写的模型MBean,则只需要修改XML文件就行了,不需要重新编译发布(可能要重启一下系统)。这就是模型Mbean 优势之所在了。
细心的人会发现动态MBean和这一节的模型Mbean非常相似,但它们还是有很大不同的:动态MBean没有Hello类,它要自己实现Hello类中的方法逻辑。
这里有个问题:
MBean的属性Name是可读写的,就是说可以对Name进行赋值,但是在运行的界面中对Name赋值后,调用print1Info打印出的信息是"Hello World, null",说明Name属性并没有赋值,不知道该如何正确操作才能正确对Name赋值。
评论
1 楼
zhaonjtu
2010-01-26
你应该添加一个setName的方法才能设置的Hello实例的name属性值。
你自己添加的那个属性Name我的理解是包裹在Hello外面的一个属性,和里面的name是两回事,内部的name只能通过方法设置。
你自己添加的那个属性Name我的理解是包裹在Hello外面的一个属性,和里面的name是两回事,内部的name只能通过方法设置。
发表评论
-
java实现Tree
2012-07-10 09:59 875/****************************** ... -
Java正则表达式应用总结
2012-05-25 12:23 1095一、概述 正则表达式是Java处理字符串、文本的重要工具。 ... -
JdbcTemplate与事务
2012-05-17 17:42 1121JdbcTemplate与事务 上例中的JdbcTemplat ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-05-09 17:59 922最近的机器内存又爆满 ... -
jconsole远程监控Java进程
2012-05-07 11:44 1073JDK中的工具jconsole可以很好地监控Java进程及其运 ... -
spring集成quartz
2012-04-16 15:56 2217首先,让spring框架运转起来,可以参看一下:ht ... -
JMX RMI 访问
2011-09-02 10:46 4512RMI(Remote Method Invocation) R ... -
采用开发框架quartz调度管理Job
2011-07-11 10:03 19541.所需要的第三方包:quartz-1.5.2.jarcom ... -
java类型转换
2011-05-20 17:13 910string和int之间的转换? 字符串转换成数据 ... -
java整型数与网络字节序的 byte[] 数组转换关系
2011-05-05 10:47 3777因工作需要在java和c/c++之间进行socket通信,而 ... -
线程安全总结(二)
2010-11-12 10:34 851站内很多人都问我,所谓线程的“工作内存”到底是个什么东西? ... -
java线程安全总结
2010-11-12 10:33 829java线程安全总结(二 ... -
ora-02289问题解决
2010-10-19 12:35 1639<id name="id" type ... -
JDBC的批处理操作三种方式 pstmt.addBatch();
2010-09-25 15:58 8715SQL批处理是JDBC性能优化的重要武器,经本人研究总结,批处 ... -
log4j输出多个自定义日志文件
2010-05-12 10:28 1514<转>http://hi.baidu.com/ ... -
spring任务调度
2010-04-28 09:48 1405概述 在JDK 1.3以后的版本中,Java通过java.ut ... -
JDK线程池的使用
2010-04-07 16:35 1454一、简介 线程池类为 j ... -
Java文件操作
2010-02-06 15:29 871本文汇集常用文件操作方法,包括文件的建立/检查与删除,目录的建 ... -
[JMX一步步来] 5、用Apache的commons-modeler来辅助开发JMX
2009-12-21 11:45 1079一、前言 每一个MBean都要有一个接口,比如前面的Hello ... -
[JMX一步步来] 4、动态MBean:DynamicMBean
2009-12-21 11:37 1531一、前言 动态MBean是在运行期才定义它的属性和方法 ...
相关推荐
【JMX学习——一步步来】 JMX,全称为Java Management Extensions,是一个用于植入管理功能到Java应用程序的框架。它提供了一套标准的接口和服务,使得开发者可以在任何Java应用中实现管理和监控。对于初学者来说,...
【JMX 一步步来】 JMX(Java Management Extensions)是一个用于在Java应用程序中添加管理和监控功能的框架。它提供了一套标准的接口和服务,使得开发者能够轻松地在Java应用中集成管理和监控的能力。JMX的核心概念...
首先,JMX是一种Java标准,它允许开发者创建可管理的Java组件,并提供了一种统一的方式来管理和监控这些组件。在Spring中,我们可以利用JMX来创建MBeans(Managed Beans),这些MBeans代表了我们的管理对象,可以是...
《JMX in Action》是一本深入探讨Java管理扩展(Java Management Extensions, JMX)技术的专业书籍,对于希望理解和掌握JMX的IT从业者来说,是一份不可或缺的参考资料。JMX是Java平台上的一个标准组件,它提供了管理...
总的来说,JMX是一个强大的工具,它让开发者能够轻松地对Java应用进行监控和管理,通过暴露管理接口,使得运维人员可以在运行时动态调整应用程序的行为,提高系统的可维护性和稳定性。通过学习和实践JMX,开发者可以...
Java Management Extensions(JMX)是Java平台中用于管理和监控应用程序、操作系统、网络设备等资源的一种标准框架。通过JMX,开发者可以创建管理代理(MBeans),这些代理暴露了各种管理特性,使得系统管理员可以...
JMX实战 书中不仅有对于基础知识的介绍,还有对于JMX开发中重大的体系架构问题的深入探讨,总结了大量JMX开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个典型的例子,兼顾各种开发平台,这些...
JMX(Java Management Extensions)是一种Java平台上的管理框架,它提供了一种标准的方式来管理和监控应用程序、设备和服务。JMX的核心概念包括MBean(Management Bean)、MBean服务器和管理接口。 **概述** JMX是...
6. **安全性**:JMX支持安全管理,可以通过设置权限来控制谁可以访问和操作MBeans。 7. **使用场景**:JMX常用于性能监控、日志管理、配置管理以及健康检查等任务。例如,你可以通过JMX监控Tomcat服务器的线程池...
**JMX(Java Management Extensions)** 是Java平台提供的一种管理和监控的标准框架,它允许开发者对应用程序、设备和服务进行管理,提供了动态发现、监控和管理的能力。JMX 可以帮助我们远程控制应用,查看其运行...
JMX允许开发者创建和注册管理 Bean(MBeans),这些Bean可以代表任何可管理的对象,如服务器、设备或者应用程序的组件。通过MBeans,我们可以获取运行时信息,设置参数,甚至执行远程操作。 在描述中提到的“jmx....
MBean(Managed Bean)是JMX中的核心概念,它代表了管理的对象,可以是系统的一个组件、服务或者任何需要被管理的资源。 2. `jmx_remote-1_0_1_03-ri.zip`: 这个文件包含了JMX的远程访问支持。JMX远程接口允许管理...
Java Management Extensions(JMX)是Java平台上的一个标准,它提供了管理和监视应用程序、服务、硬件设备等资源的能力。JMX允许开发人员创建可管理和监视的组件,并将它们集成到Java应用中。以下是对JMX配置与使用...
jmx(Java Management Extensions)是一种Java技术,为Java应用程序提供了管理和监控的功能。ActiveMQ是Apache软件基金会下的一个开源消息队列系统,提供了高效、可靠的消息传递服务。在生产环境中, ActiveMQ的监控...
本篇文章将深入探讨JMX的核心概念、功能及如何通过一个小例子来理解和使用JMX。 **1. JMX核心概念** - **MBean(Managed Beans)**: MBean是JMX中最基本的管理单元,它是Java对象,代表可管理的资源或服务。MBean...
Java Management Extensions (JMX) 是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备。`jmxri-1.2.1.jar` 和 `jmxtools-1.2.1.jar` 是与JMX相关的两个核心库文件,它们在Java应用程序中扮演...
首先,WebLogic是由Oracle公司提供的一个全面的企业级Java应用服务器,它支持JMX来暴露管理接口,允许管理员远程监控服务器的状态、配置以及执行管理操作。通过JMX,你可以获取到WebLogic服务器的运行时信息,如JVM...
总的来说,"jmx-1.2.1(jmxri+jmxtools) jar"是Java环境中管理和监控的重要工具集,它提供了远程访问和管理Java应用的能力,以及一系列辅助工具和库,使得开发者和运维人员能够更好地控制和理解他们的Java系统。