- 浏览: 236409 次
- 性别:
- 来自: 北京
最新评论
-
Xgeeeeek:
讲的很细致,多谢~
JAVA RMI 实例 -
zontim:
...
JAVA RMI 实例 -
czl026:
简单明了,谢谢
[JMX一步步来] 1、JMX的Hello World -
manxisuo:
jtianguo 写道服务端和客户端在同一个包下,这句代码He ...
JAVA RMI 实例 -
manxisuo:
非常好,多谢!!
JAVA RMI 实例
在上一节是用apache的commons-modeler来开发的一个model,只不过commons-modeler帮助我们实现了很多的代码,而我们只需要写描述XML文件就行了。这一节,来一个实打实的Model Bean,不借助任何第三方工具包。例子还是沿用Hello这个类,以便于和以前的实现相比较。
一、Model MBean实例
1、Hello.java还是和以前的一样。这里它没有再加上一个MBean接口了,只是一个很普通的类。
- 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、接下来是HelloAgent的写法,和以前就差一句:把“new Hello()”这一句删除了,加上了ModelMbeanUtils.createModlerMbean();
- 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.....");
- }
- }
3、ModelMbeanUtils这个类是要我们自己来实现的,也是写model Bean最麻烦的地方,它主要是返回一个RequiredModelMBean类,此类主要包括了一个ModelMBeanInfo类的信息。在 ModelMBeanInfo中定义了所有对需要管理的属性和方法的描述。具体代码如下:
- 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;
- }
- }
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类中的方法逻辑。
发表评论
-
Lucene全文检索样例(解决大文本建索引)
2008-01-31 10:05 6476建索引:package com.pccw; i ... -
txt读取字符串(为实习生作的例子)
2008-01-29 18:27 1928try { FileInputStream fi = n ... -
关于Lucene索引合并解决方法
2008-01-28 10:21 9278由于Clustor的问题造成无法对索引进行同步,脑子中马上浮现 ... -
Spring 2.0 AOP 与事务配置
2007-11-20 16:13 2760Spring 2.0 AOP 与事务配置 ********* ... -
关于Soeckt 流操作的数据转换工具方法
2007-11-02 10:50 2178java 代码 package com ... -
Java socket开发实例入门
2007-08-21 16:08 12192socket用中文意思就是我 ... -
不使用webwork标签直接用Jsp取得Action中的值
2007-05-22 14:23 3057今天突然一个同事问我webwork如果不用标签只用JSP ... -
23种模式趣味解释
2007-05-22 10:36 1942创建型模式 1、FACTORY ... -
关于领域逻辑的三个主要模式
2007-05-13 22:36 2674事务脚本 事务脚本比较好理解,简单来说,就是将大多是事务,以过 ... -
又谈领域模型
2007-04-29 09:58 2222昨天,突然和阿敏谈起领域模型,发现自己的理解还是 ... -
简单Socket编程,来理解Socket
2007-02-27 09:34 2212Server端: java 代码 p ... -
[JMX一步步来] 9、基于JBoss来写MBean
2007-02-02 13:31 13817前面都是用JDK自带的JMX ... -
[JMX一步步来] 8、编写程序来连接MBean
2007-02-02 13:18 5923前面用Html、jconsole等方法连接上了MBeanSer ... -
[JMX一步步来] 7、用JDK5.0的JConsole来连接MBean
2007-02-02 13:09 8612前面所有看效果都是通过Html网页来看的。JDK5.0自带了一 ... -
[JMX一步步来] 5、用Apache的commons-modeler来辅助开发JMX
2007-02-02 12:59 6960一、前言 每一个MBean都要有一个接口,比如前面的H ... -
[JMX一步步来] 4、动态MBean:DynamicMBean
2007-02-02 12:48 6479一、前言 动态MBean是在运行期才定义它的属性和方法 ... -
[JMX一步步来] 3、Notification的使用
2007-02-02 12:36 6194一、简介 Mbean之间的通信是必不可少的, ... -
[JMX一步步来] 2、JMX简介
2007-02-02 11:25 8772一、JMX简介 JMX是一 ... -
[JMX一步步来] 1、JMX的Hello World
2007-02-02 11:23 10109一、JMX简介 什么是JMX?在一篇网文中是这样说的: ... -
JAVA RMI 实例
2007-02-02 10:51 39285JAVA RMI 快速入门实例 本实例为参考多篇文章写就而成 ...
相关推荐
20.5.3 自己编写一个model MBean 164 20.5.4 注册 164 20.5.5 ManagedBean 165 20.5.6 BaseModelMBean 165 20.5.7 使用Modeler API 165 20.6 Catalian中的MBean 165 20.6.1 ClassNameMBean 165 20.6.2 ...
JavaTM 2 Platform Standard Edition 6 API 规范 本文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet ...
javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax....
javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax....
javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax....
20.5.3 自己编写一个model MBean 164 20.5.4 注册 164 20.5.5 ManagedBean 165 20.5.6 BaseModelMBean 165 20.5.7 使用Modeler API 165 20.6 Catalian中的MBean 165 20.6.1 ClassNameMBean 165 20.6.2 ...
javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax....
jdk_api_1_6帮助开发 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 ...
javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax...
javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax...
javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax...