- 浏览: 238419 次
- 性别:
- 来自: 北京
最新评论
-
Xgeeeeek:
讲的很细致,多谢~
JAVA RMI 实例 -
zontim:
...
JAVA RMI 实例 -
czl026:
简单明了,谢谢
[JMX一步步来] 1、JMX的Hello World -
manxisuo:
jtianguo 写道服务端和客户端在同一个包下,这句代码He ...
JAVA RMI 实例 -
manxisuo:
非常好,多谢!!
JAVA RMI 实例
一、前言
每一个MBean都要有一个接口,比如前面的Hello要有一个HelloMBean接口。要多维护一个接口,的确是件麻烦的事。 Apache的commons-modeler利用JMX中的动态MBean原理很好的解决了这一问题,commons-modeler使用得我们可以只写Hello,而不用写HelloMBean这个接口。不过这是有代价的,它要求我们写一个mbean的xml描述文件(唉,少了一件事,却又多出另一件事来)。但commons-modeler还是有优点的,就是它让mbean的装配更加灵活,把多个mbean的装配都集中在一个XML文件里来了。
开始实例之前,你需要先去apache网站下载commons-modeler,以及modeler的依赖项目commons-logging。下载网址为:http://jakarta.apache.org/site/downloads/downloads_commons.html,下载的文件是ZIP压缩包,解压后找到commons-logging.jar和commons-modeler.jar。如果在DOS下用命令行开发,则把这两个JAR包加入到classpath系统变量中。如果你用Eclipse开发,则把JAR包加入到项目属性的Libratries(库)引用中。
二、HelloWorld实例
我们以本系统的第一篇“1、JMX的Hello World”为例,来重新实现一次。
1、Hello.java的代码不变(注:为了在Eclipse上和原来的Hello文件放在不同的地方,我把新Hello放到了mbean.modelbean包),如下:
- package mbean.modelbean;
- import mbean.standard.HelloMBean;
- public class Hello implements HelloMBean {
- 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、MBean不用写了,但需要写一个XML描述文件。文件名任取,这里取名为:mbeans-descriptors
- <?xml version="1.0"?>
- <mbeans-descriptors>
- <mbean name="Hello" description="the hello bean" domain="chengang" group="helloGroup" type="mbean.modelbean.Hello">
- <attribute name="name" description="a name attribute" type="java.lang.String" writeable="true"/>
- <operation name="printHello" description="a operation to print hello" impact="INFO" returnType="String"/>
- </mbean>
- </mbeans-descriptors>
这里只对<mbean>标签做一下说明:
* name mbean在xml中的唯一标识,不一定要和类同名
* description mbean的注释说明信息
* domain mbean所属域
* group mbean所属组
* type mbean的类全名(包名+类名)
* classname 指定实现代理功能的ModelMbean的全名,如果不指定则默认为BaseModelMBean
3、接下来改写HelloAgent
- package mbean.modelbean;
- import java.io.InputStream;
- import javax.management.MBeanServer;
- import javax.management.ObjectName;
- import javax.management.modelmbean.ModelMBean;
- import org.apache.commons.modeler.ManagedBean;
- import org.apache.commons.modeler.Registry;
- import com.sun.jdmk.comm.HtmlAdaptorServer;
- public class HelloAgent {
- public static void main(String[] args) throws Exception {
- //基于xml中的信息构建一个Registry
- Registry registry = Registry.getRegistry(null, null);
- InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
- registry.loadMetadata(stream);
- stream.close();
- //由Registry得到一个MBeanServer
- MBeanServer server = registry.getMBeanServer();
- //得到Hello在描述文件中的信息类,对应于xml文件<mbean>标签的name属性。
- ManagedBean managed = registry.findManagedBean("Hello");
- //创建ObjectName
- ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
- //得到ModelMBean
- ModelMBean hello = managed.createMBean(new Hello());
- //注册MBean
- 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.....");
- }
- }
(1)首先,新的HelloAgent需要将xml信息读入到Registry对象中,这是旧HelloAgent所没有的。
Registry registry = Registry.getRegistry(null, null);
InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
registry.loadMetadata(stream);
stream.close();
(2)接着创建MBeanServer的方式也不同了
现在:MBeanServer server = registry.getMBeanServer();
以前: MBeanServer server = MBeanServerFactory.createMBeanServer();
(3)Hello相应的ObjectName创建也略不相同。主要是域名在XML描述文件里设置好了。
现在:ManagedBean managed = registry.findManagedBean("Hello");
ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
以前:ObjectName helloName = new ObjectName("chengang:name=HelloWorld")
(4)得到MBean的方式也不同,这里就是关键的不同点
现在:ModelMBean hello = managed.createMBean(new Hello());
以前:Hello hello = new Hello();
注意:为什么现在要比以前多一个createMbean步骤呢,就是因为现在的写法并没有写Mbean,所以需要动态才需要生成一个。而以前就直接把new Hello()注册到mbean server就可以了,server会自动找到它的HelloMBean接口文件。
也就上面四点区别,其他代码完全一样。测试和查看效果的方法和以前一样,在此不累述了。
commons Modeler为Hello动态生成了一个MBean接口:BaseModelBean
参考资料
用Commons Modeler 开发JMX应用
评论
<?xml version="1.0"?> <mbeans-descriptors> <mbean name="Hello" description="the hello bean" domain="Study" group="helloGroup" type="mbean.modelbean.Hello"> <attribute name="name" description="a name attribute" type="java.lang.String" writeable="true"/> <operation name="printHello" description="a operation to print hello" impact="INFO" returnType="String"/> <operation name="printHello" description="a operation to print hello" impact="ACTION" returnType="String"> <parameter name="whoName" description="who's name." type="java.lang.String"/> </operation> </mbean> </mbeans-descriptors>
是好文,补充点东西作为读书笔记
发表评论
-
Lucene全文检索样例(解决大文本建索引)
2008-01-31 10:05 6529建索引:package com.pccw; i ... -
txt读取字符串(为实习生作的例子)
2008-01-29 18:27 1983try { FileInputStream fi = n ... -
关于Lucene索引合并解决方法
2008-01-28 10:21 9336由于Clustor的问题造成无法对索引进行同步,脑子中马上浮现 ... -
Spring 2.0 AOP 与事务配置
2007-11-20 16:13 2814Spring 2.0 AOP 与事务配置 ********* ... -
关于Soeckt 流操作的数据转换工具方法
2007-11-02 10:50 2224java 代码 package com ... -
Java socket开发实例入门
2007-08-21 16:08 12230socket用中文意思就是我 ... -
不使用webwork标签直接用Jsp取得Action中的值
2007-05-22 14:23 3097今天突然一个同事问我webwork如果不用标签只用JSP ... -
23种模式趣味解释
2007-05-22 10:36 2033创建型模式 1、FACTORY ... -
关于领域逻辑的三个主要模式
2007-05-13 22:36 2734事务脚本 事务脚本比较好理解,简单来说,就是将大多是事务,以过 ... -
又谈领域模型
2007-04-29 09:58 2270昨天,突然和阿敏谈起领域模型,发现自己的理解还是 ... -
简单Socket编程,来理解Socket
2007-02-27 09:34 2260Server端: java 代码 p ... -
[JMX一步步来] 9、基于JBoss来写MBean
2007-02-02 13:31 13853前面都是用JDK自带的JMX ... -
[JMX一步步来] 8、编写程序来连接MBean
2007-02-02 13:18 5969前面用Html、jconsole等方法连接上了MBeanSer ... -
[JMX一步步来] 7、用JDK5.0的JConsole来连接MBean
2007-02-02 13:09 8670前面所有看效果都是通过Html网页来看的。JDK5.0自带了一 ... -
[JMX一步步来] 6、模型Bean:Model Bean
2007-02-02 13:06 5782在上一节是用apache的commons-modeler来开发 ... -
[JMX一步步来] 4、动态MBean:DynamicMBean
2007-02-02 12:48 6565一、前言 动态MBean是在运行期才定义它的属性和方法 ... -
[JMX一步步来] 3、Notification的使用
2007-02-02 12:36 6237一、简介 Mbean之间的通信是必不可少的, ... -
[JMX一步步来] 2、JMX简介
2007-02-02 11:25 8812一、JMX简介 JMX是一 ... -
[JMX一步步来] 1、JMX的Hello World
2007-02-02 11:23 10218一、JMX简介 什么是JMX?在一篇网文中是这样说的: ... -
JAVA RMI 实例
2007-02-02 10:51 39374JAVA RMI 快速入门实例 本实例为参考多篇文章写就而成 ...
相关推荐
commons-modeler.jar,构建JMX必备
Apache Commons Modeler是Apache软件基金会开发的一个开源项目,主要用于简化Java Management Extensions (JMX)的开发。JMX是一种Java平台上的标准,它提供了一种框架来管理并监控应用程序、服务和设备,允许开发者...
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题。(附件中提供了该工具包的jar包,及源文件以供研究) BeanUtils Commons-BeanUtils 提供对 Java 反射和自省API的包装 Betwixt Betwixt提供将 ...
commons-modeler 创建符合 JMX 规范的 MBeans 机制 commons-net 网络和协议实现的集合 commons-pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 commons-primitives java 简单...
commons-modeler 创建符合 JMX 规范的 MBeans 机制 commons-net 网络和协议实现的集合 commons-pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 commons-primitives java 简单...
- `commons-modeler-2.0.1.zip`:Apache Commons Modeler,用于动态建模和MBean创建,有助于实现JMX的MBean功能。 - `jmx-1_2_1-ri.zip`:早期版本的JMX实现,包含运行时接口(RI)和API。 - `jdmkrt.jar`:可能...
- **Apache Commons Modeler**:这是一个用于构建MBeans的工具包,它提供了丰富的API来简化MBeans的创建过程。 - **XDoclet**:这是一个源代码元数据工具,它可以通过注释自动为Java类生成JMX相关的代码。 通过以上...
Apache Commons 是一系列小型实用工具库,它为Java开发者提供了丰富的组件和类库,极大地扩展了标准Java库的功能。这些组件涵盖了各种领域,如数据编码、集合操作、配置管理、网络通信、XML处理、脚本执行等。以下是...
Apache Jakarta Commons 是一组由 Apache 软件基金会提供的 Java 库,这些库旨在解决常见的编程问题,提供便捷的功能,减少开发人员重复编写基础代码的工作。Jakarta Commons 包含了许多子项目,每个子项目专注于...
20.5 Commons Modeler 161 20.5.1 MBean描述符 162 20.5.1.1 mbean 162 20.5.1.2 attribute 163 20.5.1.3 operation 163 20.5.1.4 parameter 163 20.5.2 mbean标签实例 164 20.5.3 自己编写一个model MBean 164 20.5...