﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-hengheng123456789-文章分类-JMX</title><link>http://www.blogjava.net/hengheng123456789/category/14364.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 13 Mar 2007 07:00:09 GMT</lastBuildDate><pubDate>Tue, 13 Mar 2007 07:00:09 GMT</pubDate><ttl>60</ttl><item><title>利用JBossMX开发标准MBean（经典！转）</title><link>http://www.blogjava.net/hengheng123456789/articles/89227.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Thu, 21 Dec 2006 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/89227.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/89227.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/89227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/89227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/89227.html</trackback:ping><description><![CDATA[
		<span style="FONT-FAMILY: 黑体">利用</span>
		<span lang="EN-US">JBossMX</span>
		<span style="FONT-FAMILY: 黑体">开发标准</span>
		<span lang="EN-US">MBean<br /></span>
		<span style="COLOR: black; FONT-FAMILY: 宋体">
				<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
						<span lang="EN-US" style="COLOR: black">原文（<a href="http://www.ebook520.com/showbooktext.asp?id=2090&amp;backcolor=E7F4FE&amp;backsize=15">http://www.ebook520.com/showbooktext.asp?id=2090&amp;backcolor=E7F4FE&amp;backsize=15</a>）<br /><br />   JBoss</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">服务器是建立在</span>
						<span lang="EN-US" style="COLOR: black">JBoss</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">的</span>
						<span lang="EN-US" style="COLOR: black">JMX</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">实现工具（</span>
						<span lang="EN-US" style="COLOR: black">JBossMX</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">）基础上的，访问</span>
						<span lang="EN-US" style="COLOR: black">JBoss</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">网站（</span>
						<span lang="EN-US" style="COLOR: black">http://www.jboss.org</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">）可以下载到独立的</span>
						<span lang="EN-US" style="COLOR: black">JBoss JMX</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">实现工具软件包</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">。将下载到的</span>
						<span lang="EN-US" style="COLOR: black">jbossmx-1.1.2.zip</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">压缩包解压之后，把下列</span>
						<span lang="EN-US" style="COLOR: black">jar</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">文件添加到</span>
						<span lang="EN-US" style="COLOR: black">CLASSPATH</span>
						<span style="COLOR: black; FONT-FAMILY: 宋体">中：</span>
				</p>
				<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
						<span lang="EN-US" style="COLOR: black">jbossmx-1.1.2/jbossmx-1.1.2/lib/jboss-jmx.jar</span>
				</p>
				<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
						<span lang="EN-US" style="COLOR: black">jbossmx-1.1.2/jbossmx-1.1.2/lib/jboss-jmx-core.jar</span>
				</p>
				<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
						<span lang="EN-US" style="COLOR: black">JBOSS_HOME/client/gnu-regexp.jar</span>
				</p>
				<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
						<span lang="EN-US" style="COLOR: black">JBOSS_HOME/client/jbossall-client.jar</span>
				</p>
				<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">标准</p>
		</span>
		<span lang="EN-US" style="COLOR: black">MBean</span>
		<span style="COLOR: black; FONT-FAMILY: 宋体">在</span>
		<span lang="EN-US" style="COLOR: black">JBoss</span>
		<span style="COLOR: black; FONT-FAMILY: 宋体">中使用范围最广，</span>
		<span lang="EN-US" style="COLOR: black">JBoss</span>
		<span style="COLOR: black; FONT-FAMILY: 宋体">中的许多组件都是利用标准</span>
		<span lang="EN-US" style="COLOR: black">MBean</span>
		<span style="COLOR: black; FONT-FAMILY: 宋体">开发的。</span>
		<p class="5" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US" style="COLOR: black">1</span>
				<span style="COLOR: black; FONT-FAMILY: 黑体">．计数器</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="COLOR: black; FONT-FAMILY: 宋体">下面是一个计数器</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">的开发示例。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US" style="COLOR: black">1</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">）确定</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">的接口。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-BOTTOM: 7.8pt; TEXT-INDENT: 21.05pt">
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">分析计数器的功能，确定了两个方法，</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: -0.5pt">即</span>
				<span lang="EN-US" style="COLOR: black; LETTER-SPACING: -0.1pt">add()</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: -0.5pt">和</span>
				<span lang="EN-US" style="COLOR: black; LETTER-SPACING: -0.1pt">get()</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">，</span>
				<span lang="EN-US" style="COLOR: black; LETTER-SPACING: -0.1pt">add()</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">负责加数，</span>
				<span lang="EN-US" style="COLOR: black; LETTER-SPACING: -0.1pt">get()</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: -0.1pt">负</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">责加数并取回总数：</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="LAYOUT-GRID-MODE: line; COLOR: black">package</span>
				</b>
				<span lang="EN-US" style="LAYOUT-GRID-MODE: line; COLOR: black"> com.liuyang.jmx.mbeans.counter;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="LAYOUT-GRID-MODE: line; COLOR: black">public interface</span>
				</b>
				<span lang="EN-US" style="LAYOUT-GRID-MODE: line; COLOR: black"> CounterMBean {</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="LAYOUT-GRID-MODE: line; COLOR: black">    <b>public void</b> add(<b>int</b> num);</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="LAYOUT-GRID-MODE: line; COLOR: black">    <b>public int</b> get(<b>int</b> num);    </span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="LAYOUT-GRID-MODE: line; COLOR: black">}</span>
		</p>
		<p class="MsoNormal" style="MARGIN-TOP: 7.8pt; TEXT-INDENT: 21.45pt">
				<span style="COLOR: black; FONT-FAMILY: 宋体">从代码中可以看到，开发标准</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">的</span>
				<a name="OLE_LINK1">
						<span lang="EN-US" style="COLOR: black">MBean</span>
				</a>
				<span style="COLOR: black; FONT-FAMILY: 宋体">接口和开发普通接口除了需要在</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">类名称后面加上“</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">”之外，没有其他区别。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US" style="COLOR: black">2</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">）实现</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">接口。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-BOTTOM: 7.8pt; TEXT-INDENT: 21.85pt">
				<span lang="EN-US" style="COLOR: black; LETTER-SPACING: 0.1pt">CounterMBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">是一个标准</span>
				<span lang="EN-US" style="COLOR: black; LETTER-SPACING: 0.1pt">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">，所以</span>
				<span lang="EN-US" style="COLOR: black; LETTER-SPACING: 0.1pt">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">实现类的名称必须和</span>
				<span lang="EN-US" style="COLOR: black; LETTER-SPACING: 0.1pt">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">接口</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">之间遵守标准</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">的命名规范，所以</span>
				<span lang="EN-US" style="COLOR: black">CounterMBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">的实现类</span>
				<span lang="EN-US" style="COLOR: black">Counter</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">比</span>
				<span lang="EN-US" style="COLOR: black">CounterMBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">少了尾部的</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">部分，下面是</span>
				<span lang="EN-US" style="COLOR: black">Counter</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">的实现代码：</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">package</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black"> com.liuyang.jmx.mbeans.counter;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">
						<b>class</b> Counter <b>implements</b> CounterMBean {</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">                    int</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black"> sum = 0;</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 38.1pt">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">
						<b>void</b> add(<b>int</b> num) {</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">sum+=num;</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">}</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 38pt">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">
						<b>int</b> get(<b>int</b> num) {</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 53.65pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">sum+=num;</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54.2pt">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">return</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black"> sum;</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.5pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">}</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">}</span>
		</p>
		<p class="MsoNormal" style="MARGIN-TOP: 7.8pt; TEXT-INDENT: 21.45pt">
				<span style="COLOR: black; FONT-FAMILY: 宋体">从代码中也可以看到，标准</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">实现类与普通的</span>
				<span lang="EN-US" style="COLOR: black">Java</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">程序也没什么区别。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="COLOR: black; FONT-FAMILY: 宋体">（</span>
				<span lang="EN-US" style="COLOR: black">3</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">）利用</span>
				<span lang="EN-US" style="COLOR: black">JMX API</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">编写调用</span>
				<span lang="EN-US" style="COLOR: black">CounterMBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">的程序。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-BOTTOM: 7.8pt; TEXT-INDENT: 21.45pt">
				<span lang="EN-US" style="COLOR: black">JMX API</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">是</span>
				<span lang="EN-US" style="COLOR: black">Sun</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">公司为</span>
				<span lang="EN-US" style="COLOR: black">JMX</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">技术所设计的一套用来开发</span>
				<span lang="EN-US" style="COLOR: black">JMX</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">应用的编程接口，通过</span>
				<span lang="EN-US" style="COLOR: black">JMX API</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">可以管理和控制前面开发的</span>
				<span lang="EN-US" style="COLOR: black">CounterMBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">资源。下面是利用</span>
				<span lang="EN-US" style="COLOR: black">JMX API</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">编写调用</span>
				<span lang="EN-US" style="COLOR: black">CounterMBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">的程序代码：</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">package</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black"> com.liuyang.jmx.mbeans.counter;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black"> javax.management.MBeanServer;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black"> javax.management.MBeanServerFactory;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black"> javax.management.ObjectName;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">
						<b>class</b> CounterServer {</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white; COLOR: black">     public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">
						<b>static</b>
						<b>void</b> main(String[] args) <b>throws</b> Exception {</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">MBeanServer server = MBeanServerFactory.createMBeanServer();</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">ObjectName name = <b>new</b> ObjectName("book.liuyang:service=Counter");</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">server.registerMBean(<b>new</b> Counter(), name);    </span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">String[] sig1 = {"int"};</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">Object[] opArgs1 = {<b>new</b> Integer(3)};</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">Object result1 = server.invoke(name, "add", opArgs1, sig1);</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">System.out.println(result1);      </span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="COLOR: black">
				</span> </p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">String[] sig2 = {"int"};</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">Object[] opArgs2 = {<b>new</b> Integer(0)};</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">Object result2 = server.invoke(name, "get", opArgs2, sig2);</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">System.out.println(result2);              </span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">}</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">}</span>
		</p>
		<p class="5" style="MARGIN-TOP: 7.8pt; TEXT-INDENT: 21.45pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">2</span>
				<span style="BACKGROUND: white; COLOR: black; FONT-FAMILY: 黑体">．</span>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">ObjectName</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">ObjectName</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">代表一个</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">对象的名，创建一个</span>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">ObjectName</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">需要符合</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">的命名规范，例如：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">ObjectName name = <b>new</b> ObjectName("book.liuyang:service=Counter");</span>
		</p>
		<p class="5" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">3</span>
				<span style="BACKGROUND: white; COLOR: black; FONT-FAMILY: 黑体">．</span>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">MBeanServer</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="BACKGROUND: white; COLOR: black; FONT-FAMILY: 宋体">在</span>
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">CounterServer</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">程序中，首先创建的</span>
				<span lang="EN-US" style="COLOR: black">MBeanServer</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">这个对象代表前文中介绍的</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">服务器，它负责管理</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">资源，每个</span>
				<span lang="EN-US" style="COLOR: black">MBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">资源可以被注册到</span>
				<span lang="EN-US" style="COLOR: black">MBeanServer</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体">之中：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white; COLOR: black">server.registerMBean(<b>new</b> Counter(), name);</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">通过</span>
				<span lang="EN-US">MBeanServer</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US">invoke</span>
				<span style="FONT-FAMILY: 宋体">方法还可以调用一个</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">，在调用时需要传递一些与调用有关的参数：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white">Object result1 = server.invoke(name, "add", opArgs1, sig1);</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 0cm">
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">其中：</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US">name</span>
				<span style="FONT-FAMILY: 宋体">是被调用对象的对象名。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US">"add"</span>
				<span style="FONT-FAMILY: 宋体">要求</span>
				<span style="FONT-FAMILY: 宋体">调用被调对象的方法名称。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US">opArgs1</span>
				<span style="FONT-FAMILY: 宋体">是一个数组，包含着的每个数据将被作为参数传递到被调方法。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US">sig1</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">是</span>
				<span style="FONT-FAMILY: 宋体">一个数组，包含着将被作为参数传递的每个数据的数据类型。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">调用之后返回的对象包含着执行的结果。</span>
		</p>
		<p class="5" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US" style="BACKGROUND: white">4</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 黑体">．</span>
				<span lang="EN-US" style="BACKGROUND: white">MBeanServerFactory</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US" style="BACKGROUND: white">MBeanServerFactory</span>
				<span style="FONT-FAMILY: 宋体">是产生</span>
				<span lang="EN-US" style="BACKGROUND: white">MBeanServer</span>
				<span style="FONT-FAMILY: 宋体">的工厂类，使用的</span>
				<span lang="EN-US">JMX</span>
				<span style="FONT-FAMILY: 宋体">实现工具不同，通过</span>
				<span lang="EN-US" style="BACKGROUND: white">MBeanServerFactory</span>
				<span style="FONT-FAMILY: 宋体">创建的</span>
				<span lang="EN-US" style="BACKGROUND: white">MBeanServer</span>
				<span style="FONT-FAMILY: 宋体">实现对象也不同。如果</span>
				<span lang="EN-US" style="BACKGROUND: white">MBeanServer</span>
				<span style="FONT-FAMILY: 宋体">已经被创建了，那么可以通过下面的方法获取：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white">MBeanServer server = MBeanServerFactory.newMBeanServer();</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">通过这个实例，可以了解到使用</span>
				<span lang="EN-US" style="BACKGROUND: white">MBeanServer</span>
				<span style="FONT-FAMILY: 宋体">来控制</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">的基本方法，下面的</span>
				<span style="FONT-FAMILY: 宋体">用户查询</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">将进一步介绍通过</span>
				<span lang="EN-US" style="BACKGROUND: white">MBeanServer</span>
				<span style="FONT-FAMILY: 宋体">对</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">的属性进行查询的方法。</span>
		</p>
		<p class="5" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US">5</span>
				<span style="FONT-FAMILY: 黑体">．用户查询</span>
				<span lang="EN-US">MBean</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">首先，确定</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">的接口。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-BOTTOM: 7.8pt; TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">用户查询</span>
				<span lang="EN-US">MBean</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">中的用户是这个</span>
				<span lang="EN-US" style="BACKGROUND: white">MBean</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">所代表的对象，这个设计的用户包括名称和角色，在这个例子中将对这两个属性进行监控，这是</span>
				<span lang="EN-US" style="BACKGROUND: white">JMX</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">为开发者提供的一种机制，所有被管理的</span>
				<span lang="EN-US" style="BACKGROUND: white">MBean</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">都在</span>
				<span lang="EN-US" style="BACKGROUND: white">MBeanServer</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">的控制之中，这个控制不仅包括上个计数器实例中所演示的方法调用功能，也包含对这些</span>
				<span lang="EN-US" style="BACKGROUND: white">MBean</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">的相关信息进行考察的功能。</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">package</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> com.liuyang.jmx.mbeans.user;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white">
						<b>interface</b> UserMBean {</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    <b>public</b> String getName();</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    <b>public</b><b>void</b> setName(String name);<br /><br /></span>
				<b>
						<span lang="EN-US" style="BACKGROUND: white">    public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> String getRole();<br /><br /></span>
				<b>
						<span lang="EN-US" style="BACKGROUND: white">    public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white">
						<b>void</b> setRole(String string);</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21.45pt">
				<span lang="EN-US">UserMBean</span>
				<span style="FONT-FAMILY: 宋体">中被设定了两个属性：</span>
				<span lang="EN-US">name</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">role</span>
				<span style="FONT-FAMILY: 宋体">，并遵照</span>
				<span lang="EN-US">Java Bean</span>
				<span style="FONT-FAMILY: 宋体">的规则为它们提供了</span>
				<span lang="EN-US">get()</span>
				<span style="FONT-FAMILY: 宋体">和</span>
				<span lang="EN-US">set()</span>
				<span style="FONT-FAMILY: 宋体">方法。通过这两个方法可以设定</span>
				<span lang="EN-US">UserMBean</span>
				<span style="FONT-FAMILY: 宋体">的两个属性。</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">package</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> com.liuyang.jmx.mbeans.user;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white">
						<b>class</b> User <b>implements</b> UserMBean  {<br /><br /></span>
				<b>
						<span lang="EN-US" style="BACKGROUND: white">    private</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> String name = "";</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    <b>private</b> String password  = "";<br /><br /></span>
				<b>
						<span lang="EN-US" style="BACKGROUND: white">    private</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> String role  = "";</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    <b>public</b> String getName() {</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    <b>return</b> name;</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    }</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    <b>public</b><b>void</b> setName(String name) {</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">        <b>this</b>.name = name;</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    }</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 38pt">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> String getRole() {</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54.2pt">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">return</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> role;</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">}</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 38pt">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white">
						<b>void</b> setRole(String string) {</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 54pt">
				<span lang="EN-US" style="BACKGROUND: white">role = string;</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">}</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">}</span>
		</p>
		<p class="MsoNormal" style="MARGIN-TOP: 7.8pt; TEXT-INDENT: 21.45pt">
				<span lang="EN-US" style="BACKGROUND: white">User</span>
				<span style="FONT-FAMILY: 宋体">这个类只是以最简单的方式实现了</span>
				<span lang="EN-US">UserMBean</span>
				<span style="FONT-FAMILY: 宋体">接口。</span>
		</p>
		<p class="MsoNormal" style="MARGIN-BOTTOM: 7.8pt; TEXT-INDENT: 21.45pt">
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">下</span>
				<span style="FONT-FAMILY: 宋体">面</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US" style="BACKGROUND: white">UserQueries</span>
				<span style="FONT-FAMILY: 宋体">演示了</span>
				<span style="FONT-FAMILY: 宋体">通过</span>
				<span lang="EN-US" style="BACKGROUND: white">MBeanServer</span>
				<span style="FONT-FAMILY: 宋体">对</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">的属性进行查询的方法，代码如下：</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">package</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> com.liuyang.jmx.mbeans.user;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> java.util.Iterator;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> java.util.Set;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> javax.management.Attribute;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> javax.management.MBeanServer;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> javax.management.MBeanServerFactory;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> javax.management.ObjectName;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> javax.management.Query;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">import</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> javax.management.QueryExp;</span>
		</p>
		<p class="a0">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">public</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white">
						<b>class</b> UserQueries {</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">  <b>public</b><b>static</b><b>void</b> main(String[] args) <b>throws</b> Exception {</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    MBeanServer server = MBeanServerFactory.createMBeanServer();</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    ObjectName user1 = <b>new</b> ObjectName("book.liuyang:Name=user1");</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    ObjectName user2 = <b>new</b> ObjectName("book.liuyang:Name=user2");</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    server.createMBean("com.liuyang.jmx.mbeans.user.User", user1);</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    server.createMBean("com.liuyang.jmx.mbeans.user.User", user2);<br /><br /></span>
				<span lang="EN-US" style="BACKGROUND: white">    server.setAttribute(user1, <b>new</b> Attribute("Name", "user1"));<br /><br /></span>
				<span lang="EN-US" style="BACKGROUND: white">    server.setAttribute(user2, <b>new</b> Attribute("Name", "user2"));</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    server.setAttribute(user1, <b>new</b> Attribute("Role", "code"));</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">    server.setAttribute(user2, <b>new</b> Attribute("Role", "test"));</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">QueryExp exp = Query.match(Query.attr("Name"),Query.value("user1"));</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">ObjectName scope = <b>new</b> ObjectName("book.liuyang:*");    </span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">Set set      = server.queryNames(scope, exp);    </span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">Iterator it  = set.iterator();</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">System.out.println("</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">下列</span>
				<span lang="EN-US" style="BACKGROUND: white">MBean</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">的名字是：</span>
				<span lang="EN-US" style="BACKGROUND: white">user1");</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 38pt">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">while</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> (it.hasNext()) {</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.5pt">
				<span lang="EN-US" style="BACKGROUND: white">  System.out.println(it.next());    </span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">}</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">scope = <b>new</b> ObjectName("book.liuyang:*");    </span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">exp = Query.initialSubString(Query.attr("Role"),Query.value("t"));</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">set   = server.queryNames(scope, exp);    </span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">it    = set.iterator();</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">System.out.println("</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">下列</span>
				<span lang="EN-US" style="BACKGROUND: white">MBean</span>
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">的角色是：</span>
				<span lang="EN-US" style="BACKGROUND: white">test");</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 38pt">
				<b>
						<span lang="EN-US" style="BACKGROUND: white">while</span>
				</b>
				<span lang="EN-US" style="BACKGROUND: white"> (it.hasNext()) {</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">  System.out.println(it.next());</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 37.85pt">
				<span lang="EN-US" style="BACKGROUND: white">}</span>
		</p>
		<p class="a0" style="MARGIN-LEFT: 21.55pt; TEXT-INDENT: 29.7pt">
				<span lang="EN-US" style="BACKGROUND: white">}</span>
		</p>
		<p class="a0">
				<span lang="EN-US" style="BACKGROUND: white">}</span>
		</p>
		<p class="MsoNormal" style="MARGIN-TOP: 7.8pt; TEXT-INDENT: 20.45pt">
				<span style="FONT-SIZE: 10pt; BACKGROUND: white; FONT-FAMILY: 宋体">在</span>
				<span lang="EN-US">UserQueries</span>
				<span style="FONT-FAMILY: 宋体">中创建了两个</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">对象：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white">server.createMBean("com.liuyang.jmx.mbeans.user.User", user1);</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 20.45pt">
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">这是</span>
				<span lang="EN-US">MBeanServer</span>
				<span style="FONT-FAMILY: 宋体">通过</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">类的名称创建</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">实例的方法。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">然后分别设置它们的属性：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white">server.setAttribute(user1, <b>new</b> Attribute("Name", "user1"));</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">一个</span>
				<span lang="EN-US">Attribute</span>
				<span style="FONT-FAMILY: 宋体">对象代表一个属性。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US">JMX API</span>
				<span style="FONT-FAMILY: 宋体">为查询服务建立标准的接口方法，第一步是建立查询表达式：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white">QueryExp exp = Query.match(Query.attr("Name"),Query.value("user1"));</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">这个查询表达式是以全匹配的方式进行的，</span>
				<span lang="EN-US">JMX</span>
				<span style="FONT-FAMILY: 宋体">还支持部分模糊查询的功能：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white">exp = Query.initialSubString(Query.attr("Role"),Query.value("t"));</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span lang="EN-US" style="BACKGROUND: white">initialSubString</span>
				<span style="FONT-FAMILY: 宋体">建立的查询方法只会匹配名称的开始部分，在这里只要以“</span>
				<span lang="EN-US">t</span>
				<span style="FONT-FAMILY: 宋体">”开头的值都会被匹配。</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">然后，通过一个</span>
				<span lang="EN-US">MBean</span>
				<span style="FONT-FAMILY: 宋体">名称对象来代表查询范围：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white">ObjectName scope = <b>new</b> ObjectName("book.liuyang:*");</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="FONT-FAMILY: 宋体">最后，通过</span>
				<span lang="EN-US">MBeanServer</span>
				<span style="FONT-FAMILY: 宋体">执行查询表达式的操作，得到结果：</span>
		</p>
		<p class="a0" style="MARGIN: 7.8pt 0cm 7.8pt 21.55pt">
				<span lang="EN-US" style="BACKGROUND: white">Set set = server.queryNames(scope, exp);   </span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 21.45pt">
				<span style="BACKGROUND: white; FONT-FAMILY: 宋体">运行</span>
				<span lang="EN-US" style="BACKGROUND: white">UserQueries</span>
				<span style="FONT-FAMILY: 宋体">可以得到查询结果。</span>
		</p>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/89227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-12-21 11:05 <a href="http://www.blogjava.net/hengheng123456789/articles/89227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发Jboss Mbean服务</title><link>http://www.blogjava.net/hengheng123456789/articles/87766.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Thu, 14 Dec 2006 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/87766.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/87766.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/87766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/87766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/87766.html</trackback:ping><description><![CDATA[
		<p>众所周知Jboss依赖于JMX来装载MBean服务，而这些MBean服务组成了具体服务器实例的差异性。标准JBoss发布版本提供的所有功能都是基于MBean的。所以，如果要为JBoss服务器添加新的服务，最好的方法是开发自己的JMX MBean服务。<br />MBean服务的生命周期是由如下三个JBoss MBean负责的：SARDeployer、ServiceConfigurator、ServiceController。<br /><br />如自定义MBean服务依赖于其他MBean服务，可以通过如下方法实现：<br />1、在自定义MBean接口中添加Service中任何方法。<br />   这种方式避免了对JBoss具体接口的依赖。<br />2、为自定义MBean接口扩展org.jboss.system.Service接口。<br /><br />3、为自定义MBean接口扩展org.jboss.system.ServiceMBean接口。<br />   最简单的办法是将自定义MBean接口继承于ServiceMBean接口，将MBean实现类继承ServiceMBeanSupport类。ServiceMBeanSupport已经实现了ServiceMBean接口，ServiceMBeanSupport还集成了日志、JBoss服务状态管理跟踪功能，这些方法需要我们具体实现createService、startService、stopService和destroyService中的部分方法。<br /><br />下面介绍基于ServiceMBean接口和ServiceMBeanSupport类的JNDIMapMBean接口及其JNDIMap实现类。<br /><br />package org.joss.chap2.ex2;</p>
		<p>import javax.naming.NamingException;</p>
		<p>import org.jboss.system.ServiceMBean;</p>
		<p>public interface JNDIMapMBean extends ServiceMBean<br />{<br /> public String getJndiName();<br /> public void setJndiName(String jndiName) throws NamingException;<br />}<br /><br />package org.joss.chap2.ex2;</p>
		<p>import java.util.HashMap;</p>
		<p>import javax.management.MBeanServer;<br />import javax.management.ObjectName;<br />import javax.naming.InitialContext;<br />import javax.naming.Name;<br />import javax.naming.NamingException;</p>
		<p>import org.jboss.naming.NonSerializableFactory;<br />import org.jboss.system.ServiceMBeanSupport;</p>
		<p>public class JNDIMap extends ServiceMBeanSupport implements JNDIMapMBean<br />{<br /> private String jndiName;<br /> private HashMap contextMap = new HashMap();</p>
		<p> public JNDIMap()<br /> {<br />  super();<br />  // TODO Auto-generated constructor stub<br /> }</p>
		<p> public String getJndiName()<br /> {<br />  <br />  return jndiName;<br /> }</p>
		<p> public void setJndiName(String jndiName) throws NamingException<br /> {<br />  String oldName = this.jndiName;<br />  this.jndiName = jndiName;<br />  if(super.getState()==STARTED)<br />  {<br />   unbind(oldName);<br />   try<br />   {<br />    rebind();<br />   }<br />   catch(Exception e)<br />   {<br />    NamingException ne = new NamingException("Failed to update jndiName");<br />    ne.setRootCause(e);<br />    throw ne;<br />   }<br />  }</p>
		<p> }<br /> <br /> public void startService()throws Exception<br /> {<br />  rebind();<br /> }<br /> <br /> <br /> public void stopService() <br /> {<br />  unbind(jndiName);<br /> }<br /> <br /> private void rebind() throws NamingException<br /> {<br />  InitialContext rootCtx = new InitialContext();<br />  Name fullName = rootCtx.getNameParser("").parse(jndiName);<br />  NonSerializableFactory.rebind(fullName,contextMap,true);<br /> }<br /> <br /> private void unbind(String jndiName)<br /> {<br />  try<br />  {<br />   InitialContext rootCtx = new InitialContext();<br />   rootCtx.unbind(jndiName);<br />   NonSerializableFactory.unbind(jndiName);<br />  }<br />  catch(NamingException e)<br />  {<br />   System.out.println(e);<br />  }<br /> }</p>
		<p> public String getName()<br /> {<br />  // TODO Auto-generated method stub<br />  return null;<br /> }</p>
		<p> public int getState()<br /> {<br />  // TODO Auto-generated method stub<br />  return 0;<br /> }</p>
		<p> public String getStateString()<br /> {<br />  // TODO Auto-generated method stub<br />  return null;<br /> }</p>
		<p> public void jbossInternalLifecycle(String arg0) throws Exception<br /> {<br />  // TODO Auto-generated method stub</p>
		<p> }</p>
		<p> public void create() throws Exception<br /> {<br />  // TODO Auto-generated method stub</p>
		<p> }</p>
		<p> public void start() throws Exception<br /> {<br />  // TODO Auto-generated method stub</p>
		<p> }</p>
		<p> public void stop()<br /> {<br />  // TODO Auto-generated method stub</p>
		<p> }</p>
		<p> public void destroy()<br /> {<br />  // TODO Auto-generated method stub</p>
		<p> }</p>
		<p> public ObjectName preRegister(MBeanServer arg0, ObjectName arg1)<br />   throws Exception<br /> {<br />  // TODO Auto-generated method stub<br />  return null;<br /> }</p>
		<p> public void postRegister(Boolean arg0)<br /> {<br />  // TODO Auto-generated method stub</p>
		<p> }</p>
		<p> public void preDeregister() throws Exception<br /> {<br />  // TODO Auto-generated method stub</p>
		<p> }</p>
		<p> public void postDeregister()<br /> {<br />  // TODO Auto-generated method stub</p>
		<p> }</p>
		<p>}<br /><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
		<p>&lt;server&gt;</p>
		<p> &lt;mbean code="org.joss.chap2.ex2.JNDIMap"<br />  name="chap2.ex2:service=JNDIMap"&gt;</p>
		<p>  &lt;attribute name="JndiName"&gt;inmemory/map/MapTest&lt;/attribute&gt;<br />  &lt;depends&gt;jboss:service=Naming&lt;/depends&gt;</p>
		<p> &lt;/mbean&gt;</p>
		<p>&lt;/server&gt;</p>
		<p>
				<br />
				<br /> </p>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/87766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-12-14 18:03 <a href="http://www.blogjava.net/hengheng123456789/articles/87766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于JBoss来写MBean （转）</title><link>http://www.blogjava.net/hengheng123456789/articles/87291.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Tue, 12 Dec 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/87291.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/87291.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/87291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/87291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/87291.html</trackback:ping><description><![CDATA[来源：<a href="/chengang/archive/2006/03/07/34091.html">http://www.blogjava.net/chengang/archive/2006/03/07/34091.html</a><br /><br /><h2 style="MARGIN: 12pt 0cm"><font size="3"><span><font face="Arial"><span style="mso-spacerun: yes">一、  </span>HelloWorld</font></span><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">实例</span></font><span><p></p></span></h2><h3 style="MARGIN: 12pt 0cm 6pt"><span><font face="宋体, MS Song" size="2">1、准备工作</font></span></h3><p><font size="2"><span><font face="Times New Roman">　　JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">实现了</span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">规范，这个实例是基于</span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">来实现的。请先去下载一个</span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">，我是</span><span><font face="Times New Roman">jboss-3.2.6</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">，下载地址：</span><span><a href="http://www.jboss.com/downloads/index#as"><font face="Times New Roman" color="#1d58d1">http://www.jboss.com/downloads/index#as</font></a></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">。这个实例需要</span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的两个</span><span><font face="Times New Roman">JAR</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">包的支持：</span><span><font face="Times New Roman">jboss-system-3.2.6.jar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">、</span><span><font face="Times New Roman">jboss-jmx-3.2.6.jar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">，如果你和我一样用</span><span><font face="Times New Roman">Eclipse</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">来开发（推荐），那么把这个两个包加入到项目的库引用中（加入到库引用的方法参考前面两章）。</span></font></p><h3 style="MARGIN: 12pt 0cm 6pt"><span><font face="宋体, MS Song" size="2">2、程序代码</font></span></h3><p><font size="3"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">　　<font size="2">假设我们有一个叫</font></span></font><font size="2"><span><font face="Times New Roman">message</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的属性要需要经常进行改动配置的，那么我们就把它写成一个</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">。</span></font></p><p><font size="2"><span><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">、</span><span><font face="Times New Roman">HelloWorldServiceMBean</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">接口</span></font></p><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">　　在写</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">之前，我们先需要写一个</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">接口，接口里的方法都是属性的</span><span><font face="Times New Roman">set/get</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">方法。这个接口必须继承接口</span><span><font face="Times New Roman">ServiceMBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">。</span></font></p><div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ffead5; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><span><font face="Courier New" size="2"><br /></font></span><span><font face="Courier New" size="2">import org.jboss.system.ServiceMBean;<br /></font></span><span><font face="Courier New" size="2">public interface HelloWorldServiceMBean extends ServiceMBean {<br /></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">    </span>String getMessage();<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">    </span>void setMessage(String message);<br /></font></font></span><span><font face="Courier New" size="2">}</font></span></div><p><font size="2"><span>2</span><font face="宋体"><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">、</span><span>HelloWorldService</span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">实现类</span></font></font></p><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">　　然后写出</span><span>HelloWorldServiceMBean</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">接口的实现类</span><span>HelloWorldService</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">，这个实现类还必须继承</span><span>ServiceMBeanSupport</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">类。</span></font><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">这种类再简单不过了，就是属性和相应的</span><span>set/get</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">方法，</span><span>EJB</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">中叫实体类、</span><span>Hibernate</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">中叫</span><span>POJO</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">。</span><span></span></font></p><p></p><div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ffead5; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><p><span></span></p><p></p><p><span><font face="Courier New" size="2">import org.jboss.system.ServiceMBeanSupport;<br /></font></span><span><font face="Courier New" size="2">public class HelloWorldService extends ServiceMBeanSupport implements HelloWorldServiceMBean {<br /></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">    </span>private String message;<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">    </span>public String getMessage() {<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">        </span>System.out.println("getMessage()=" + message);<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">        </span>return message;<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">    </span>}</font></font></span></p><p><span></span></p><p></p><p><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">    </span>public void setMessage(String message) {<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">        </span>System.out.println("setMessage(" + message + ")");<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">        </span>this.message = message;<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-spacerun: yes">    </span>}<br /></font></font></span><span><font face="Courier New" size="2">}</font></span></p></div><p><font size="2"><span>3</span><font face="宋体"><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">、配置文件</span><span>jboss-service.xml</span></font></font></p><p></p><div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ffead5; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><p><span><font face="Courier New" size="2">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br /></font></span><span><font face="Courier New" size="2">&lt;server&gt;<br /></font></span><span><font size="2"><font face="Courier New"><span style="mso-tab-count: 1">    </span>&lt;mbean code="example.mbean.HelloWorldService" name="www.chengang.com.cn:service=HelloWorld"&gt;<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-tab-count: 2">        </span>&lt;attribute name="Message"&gt;Hello World&lt;/attribute&gt;<br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-tab-count: 1">    </span>&lt;/mbean&gt;<br /></font></font></span><span><font face="Courier New" size="2">&lt;/server&gt;</font></span></p></div><p><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: "><font size="2">说明：</font></span></p><p><font size="2"><span style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span></span></span><span><font face="Times New Roman">code</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">项指向</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的实现类</span><span><font face="Times New Roman">HelloWorldService<br /></font></span></font><font size="2"><span style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span></span></span><span><font face="Times New Roman">name</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">项是一个名称，格式一般是：</span><span><font face="Times New Roman">[</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">说明性文字</span><span><font face="Times New Roman">]:service=[</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">类名</span><span><font face="Times New Roman">]<br /></font></span></font><font size="2"><span style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span></span></span><span><font face="Times New Roman">attribute</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">是为属性设置初始值，这样当</span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">一加载</span><span><font face="Times New Roman">HelloWorldService</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">类时，</span><span><font face="Times New Roman">message</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">属性就有了一个初始值</span><span><font face="Times New Roman">Hello World</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">。注意</span><span><font face="Times New Roman">Message</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的第一个字母必须是大写。</span></font></p><h3 style="MARGIN: 12pt 0cm 6pt"><span><font face="宋体, MS Song" size="3">二、将实例部署到JBOSS</font></span></h3><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">　　在</span><span><font face="Times New Roman">jboss-3.2.6\server\default\deploy</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">目录下创建一个</span><span><font face="Times New Roman">hello.sar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">目录，然后创建如下目录文件结构：</span></font></p><p><span><font face="Times New Roman" size="2">hello.sar<br /></font></span><span><font face="Times New Roman" size="2">|----example<br /></font></span><span><font face="Times New Roman" size="2">|<span style="mso-spacerun: yes">            |</span>----mbean<br /></font></span><font size="2"><span><font face="Times New Roman">|<span style="mso-spacerun: yes">                    |</span>----HelloWorldService.class<span style="mso-spacerun: yes">  </span>(</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">注意：是</span><span><font face="Times New Roman">*.class</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">，不是</span><span><font face="Times New Roman">*.java)<br /></font></span></font><span><font face="Times New Roman" size="2">|<span style="mso-spacerun: yes">                    |</span>----HelloWorldServiceMBean.class<br /></font></span><span><font face="Times New Roman" size="2">|----META-INF<br /></font></span><span><font face="Times New Roman" size="2">             |----jboss-service.xml</font></span></p><p><font size="2"></font></p><p><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: "><font size="2">其他说明：</font></span></p><p><font size="2"><span style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span></span></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">也可以将</span><span><font face="Times New Roman">hello.sar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">目录用</span><span><font face="Times New Roman">zip</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">格式压缩成一个同名的</span><span><font face="Times New Roman">hello.sar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">文件，放到</span><span><font face="Times New Roman">jboss-3.2.6\server\default\deploy</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">目录下。<br /></span></font><font size="2"><span style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span></span></span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">支持热部署，也就是说你在布置这个目录时并不需要重启</span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">。</span></font></p><h3 style="MARGIN: 12pt 0cm 6pt"><span><font face="宋体, MS Song"><font size="3">三、MBean的效果</font></font></span></h3><h3> </h3><h3 style="MARGIN: 12pt 0cm 6pt"><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">打开网址：</span><span><a href="http://127.0.0.1:8080/jmx-console/"><font face="Times New Roman" color="#1d58d1">http://127.0.0.1:8080/jmx-console/</font></a></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">　，出现下图</span></font></h3><h3 style="MARGIN: 12pt 0cm 6pt"><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: "></span><span><span lang="EN-US"><img height="208" alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/102036/o_20050424image001.jpg" width="540" border="0" /></span></span></font></h3><p><font size="2"></font></p><p><font size="2"><span></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">然后单击“</span><span><font face="Times New Roman">service=HelloWorld</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">”项打开详细页面如下：<br /><br /><span lang="EN-US"><img height="777" alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/102036/o_20050424image002.jpg" width="589" border="0" /></span><br /></span></font></p><p><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: "><font size="2"></font></span></p><p><span><font size="2"></font></span></p><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: "><br />将“</span><span><font face="Times New Roman">HelloWorld</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">”改成“</span><span><font face="Times New Roman">Hello World</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">，</span><span><font face="Times New Roman">ChenGang</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">”，再单击“</span><span><font face="Times New Roman">Apply Changes</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">”应用修改，得到如下效果：<br /></span></font></p><p><span><font size="2"></font></span></p><h2 style="MARGIN: 12pt 0cm"><span><font face="Arial" size="2"></font></span></h2><h2 style="MARGIN: 12pt 0cm"><font size="3"><span><span lang="EN-US"><img height="215" alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/102036/o_20050424image003.jpg" width="635" border="0" /></span></span></font></h2><h2 style="MARGIN: 12pt 0cm"><font size="3"><span></span></font> </h2><h2 style="MARGIN: 12pt 0cm"><font size="3"><span>四、</span><font face="宋体"><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">其他类如何使用</span><span>Messag</span><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">属性</span></font></font></h2><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">　　现在我们可以通过一个自动提供的</span><span><font face="Times New Roman">WEB</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">页面来设置</span><span><font face="Times New Roman">Message</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">属性了，接下来的问题是：“在其他类中应该如何得到</span><span><font face="Times New Roman">Message</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的属性值”。</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">在</span><span><font face="Times New Roman">JBoss</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">是只保留一个</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的实例（单例模式？），也就是说问题转成我们如何去取得这个唯一实例。例程如下：</span></font></p><p><font size="2"><span><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">、创建一个使用到</span><span><font face="Times New Roman">Message</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">属性的类</span></font></p><div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ffead5; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><p><span><font face="Courier New" size="2"></font></span></p><p><span><font size="2"></font></span></p><p><font size="2"></font></p><span><font face="Courier New" size="2">import org.jboss.mx.util.MBeanProxyExt;<br /></font></span><span><font face="Courier New" size="2">import org.jboss.mx.util.ObjectNameFactory;<br /></font></span><span><font face="Courier New" size="2">public class Client {<br /></font></span><span><font face="Courier New"><font size="2"><span style="mso-spacerun: yes">    </span>public void go() {<br /></font></font></span><span><font face="Courier New"><font size="2"><span style="mso-spacerun: yes">        </span>HelloWorldServiceMBean mbean = (HelloWorldServiceMBean) MBeanProxyExt.create(HelloWorldServiceMBean.class, ObjectNameFactory.create(<a href="http://www.chengang.com.cn:service=HelloWorld/"><font color="#1d58d1">www.chengang.com.cn:service=HelloWorld</font></a>));<br /></font></font></span><span><font face="Courier New"><font size="2"><span style="mso-spacerun: yes">  </span><span style="mso-spacerun: yes">      </span>String msg = mbean.getMessage();<br /></font></font></span><span><font face="Courier New"><font size="2"><span style="mso-spacerun: yes">        </span>System.out.println("Client.go()=" + msg);<br /></font></font></span><span><font face="Courier New"><font size="2"><span style="mso-spacerun: yes">    </span>}<br /></font></font></span><span><font face="Courier New" size="2">}</font></span><font face="Courier New" size="2"> </font></div><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">注意：</span><span><font face="Times New Roman">go</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">方法里是三句。第一句比较长，它是根据</span><span><font face="Times New Roman">jboss-service.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">文件中设置的</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">名称，来取得此</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">在</span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">中的实例。</span><span></span></font></p><p><font size="2"></font></p><p><font size="2"><span><font face="Times New Roman">2</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">、在</span><span><font face="Times New Roman">Mbean</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">中加一个相应的调用</span><span><font face="Times New Roman">Client.go</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">的方法</span></font></p><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">　在</span><span><font face="Times New Roman">HelloWorldServiceMBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">接口中加入一句：</span></font></p><div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ffead5; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><p><span><font face="Courier New" size="2">void callGo();</font></span></p></div><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">在</span><span><font face="Times New Roman">HelloWorldService</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">类中加入现实方法：</span></font></p><div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #ffead5; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"><p><span><font face="Courier New"><font size="2"><span style="mso-spacerun: yes">    </span>public void callGo() {<br /></font></font></span><span><font face="Courier New"><font size="2"><span style="mso-spacerun: yes">        </span>new Client().go();<br /></font></font></span><span><font face="Courier New"><font size="2"><span style="mso-spacerun: yes">    </span>}</font></font></span></p></div><p><font size="2"><span><font face="Times New Roman">3</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">、更新布署</span></font></p><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">   将三个类的</span><span><font face="Times New Roman">class</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">文件：</span><span><font face="Times New Roman">Clien.class</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">、</span><span><font face="Times New Roman">HelloWorldServiceMBean.class</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">、</span><span><font face="Times New Roman">HelloWorldService.class</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">，更新到</span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的</span><span><font face="Times New Roman">hello.sar\example\mbean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">目录下。然后重启</span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">。</span></font></p><p><font size="2"><span><font face="Times New Roman">4</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">、查看效果</span></font></p><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">   打开</span><span><font face="Times New Roman">JBOSS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">提供的</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">设置页面，如下，发现多了一个</span><span><font face="Times New Roman">callGo</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">。</span></font></p><p><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: "><font size="2"></font></span></p><p><span><font size="2"></font></span></p><p><font size="2"></font></p><p><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: "><span lang="EN-US"><img height="272" alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/102036/o_20050424image004.jpg" width="432" border="0" /></span><br /><br />单击</span><span><font face="Times New Roman">callGo</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">项后的</span><span><font face="Times New Roman">invoke</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">按钮，得到如下的</span><span><font face="Times New Roman">DOS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">输出：</span></font></p><p><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: "><font size="2"></font></span></p><p><span><font size="2"></font></span></p><h2 style="MARGIN: 12pt 0cm"><font size="3"><span><span lang="EN-US"><img height="102" alt="" src="http://blog.csdn.net/images/blog_csdn_net/glchengang/102036/o_20050424image005.jpg" width="458" border="0" /></span></span></font></h2><h2 style="MARGIN: 12pt 0cm"><font size="3"><span></span></font> </h2><h2 style="MARGIN: 12pt 0cm"><font size="3"><span>五、</span><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial"><font face="宋体">其他说明</font></span></font></h2><p><font size="2"><span style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span></span></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">本实例仅演示了一个</span><span><font face="Times New Roman">Message</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">属性，你当然可以在</span><span><font face="Times New Roman">HelloWorldService</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">中加入更多属性，别忘了在</span><span><font face="Times New Roman">HelloWorldServiceMBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">接口也加入相应的</span><span><font face="Times New Roman">set/get</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">方法。<br /></span></font><font size="2"><span style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span></span></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">本实例的</span><span><font face="Times New Roman">message</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">属性是</span><span><font face="Times New Roman">String</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">类型的，但</span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">也支持其他的类型，甚至是</span><span><font face="Times New Roman">XML</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">信息。对于</span><span><font face="Times New Roman">jboss-service.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">中的</span><span><font face="Times New Roman">XML</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">信息，这时属性类型要求是</span><span><font face="Times New Roman">org.w3c.dom.Element</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">，</span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">将它封装成了一个</span><span><font face="Times New Roman">XML</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的</span><span><font face="Times New Roman">DOM</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">对象。<br /></span></font><font size="2"><span style="FONT-SIZE: 7.5pt; FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT-WEIGHT: normal; FONT-SIZE: 7pt; LINE-HEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span></span></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">回顾一下，</span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">也是将配置信息写在了一个文件（</span><span><font face="Times New Roman">jboss-service.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">文件）里嘛，相对于将配置文件写到</span><span><font face="Times New Roman">*.properties</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">文件的方式，它似乎也没什么新鲜的地方。但通过本章实例我们可以看到</span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的一些好处：我们不用写代码去读配置文件的信息，而且</span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">支持的属性类型是多种多样的（如上面说的</span><span><font face="Times New Roman">org.w3c.dom.Element</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">）。更重要的是</span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">还提供了一整套的属性之前互相访问、互相调用的功能，这个</span><span><font face="Times New Roman">HelloWorld</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">实例所反映的只是冰山一角而已。</span><span></span></font></p><p><font size="2"></font></p><h2 style="MARGIN: 12pt 0cm"><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial"><font face="宋体" size="3">六、参考资料：</font></span><span><a href="http://www.huihoo.com/java/jmx/jmx_base.html"><font face="Times New Roman" color="#1d58d1" size="2">http://www.huihoo.com/java/jmx/jmx_base.html</font></a><font size="2">　</font></span><span></span></h2><img src ="http://www.blogjava.net/hengheng123456789/aggbug/87291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-12-12 16:40 <a href="http://www.blogjava.net/hengheng123456789/articles/87291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>7、用JDK5.0的JConsole来连接MBean</title><link>http://www.blogjava.net/hengheng123456789/articles/66840.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Thu, 31 Aug 2006 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/66840.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/66840.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/66840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/66840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/66840.html</trackback:ping><description><![CDATA[
		<font size="2">前面所有看效果都是通过Html网页来看的。JDK5.0自带了一个jmx客户端，叫jconsole，位于c:\jdk\bin\jconsole.exe。我们来用用这个客户端来连接Mbean Server。<br />　<br />一、vm参数方式<br />　<br />1、还是用第一篇的那个HelloAgent，修改HelloAgent，将第一句：<br />MBeanServer server = MBeanServerFactory.createMBeanServer();<br />改为：MBeanServer server = ManagementFactory.getPlatformMBeanServer();<br />注：ManagementFactory的全路径为：java.lang.management.ManagementFactory<br />　<br />2、修改Eclipse的run选项，把“-Dcom.sun.management.jmxremote=HelloAgent”这一句加入到run选项中<br />　<br />3、运行HelloAgent，然后在Dos窗口输入“jconsole”来启到JConsole<br />4、单击“连接”<br />　<br />二、RMI方式<br />　<br />　　还是用jconsole，但方式变了。这里不需要象上面那样修改Eclipse run的vm选项。<br />　<br />1、还是用第一篇的HelloAgent，加上一段代码，启动一个JMXConnectorServer服务<br /><br />import javax.management.MBeanServer;<br />import javax.management.MBeanServerFactory;<br />import javax.management.ObjectName;<br />import javax.management.remote.JMXConnectorServer;<br />import javax.management.remote.JMXConnectorServerFactory;<br />import javax.management.remote.JMXServiceURL;<br /><br />import com.sun.jdmk.comm.HtmlAdaptorServer;<br /><br />public class HelloAgent {<br />    public static void main(String args[]) throws Exception {<br />        MBeanServer server = MBeanServerFactory.createMBeanServer();<br />        ObjectName helloName = new ObjectName("chengang:name=HelloWorld");<br />        Hello hello = new Hello();<br />        server.registerMBean(hello, helloName);<br />        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");<br />        HtmlAdaptorServer adapter = new HtmlAdaptorServer();<br />        server.registerMBean(adapter, adapterName);<br />        adapter.start();<br />        System.out.println("start.....");<br /><br />        // Create an RMI connector and start it<br />        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");<br />        JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);<br />        cs.start();<br />        System.out.println("rmi　start.....");<br />    }<br />}<br /><br /> 　<br />2、在Dos运行一个命令：rmiregistry 9999<br /> <br />3、运行HelloAgent，然后再在dos下运行命令jconsole<br />输入service:jmx:rmi:///jndi/rmi://localhost:9999/server<br />　<br />三、总结<br />　　连接MBeanServer的方式除了Html、JConsole，还有一些第三方的客户端，比较有名的是MC4j，通过这些客户端我们可以很容易去访问MBean。这也就是我们为什么要用JMX的其中一个原因：试想如果我自己搞一套标准，势必要自己开发一个客户端，那会是一个不小的工作量。</font>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/66840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-08-31 12:55 <a href="http://www.blogjava.net/hengheng123456789/articles/66840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>6、模型Bean：Model Bean</title><link>http://www.blogjava.net/hengheng123456789/articles/66579.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Wed, 30 Aug 2006 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/66579.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/66579.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/66579.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/66579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/66579.html</trackback:ping><description><![CDATA[
		<p>在上一节是用apache的commons-modeler来开发的一个model，只不过commons-modeler帮助我们实现了很多的代码，而我们只需要写描述XML文件就行了。这一节，来一个实打实的Model Bean，不借助任何第三方工具包。例子还是沿用Hello这个类，以便于和以前的实现相比较。<br />　<br />一、Model MBean实例<br />1、Hello.java还是和以前的一样。这里它没有再加上一个MBean接口了，只是一个很普通的类。<br /><br />public class Hello{<br />    private String name;<br />    public String getName() {<br />        return name;<br />    }<br />    public void setName(String name) {<br />        this.name = name;<br />    }<br />    public void printHello() {<br />        System.out.println("Hello World, " + name);<br />    }<br />    public void printHello(String whoName) {<br />        System.out.println("Hello , " + whoName);<br />    }<br />}<br /><br />　<br />2、接下来是HelloAgent的写法，和以前就差一句：把“new Hello()”这一句删除了，加上了ModelMbeanUtils.createModlerMbean();<br /><br />import javax.management.MBeanServer;<br />import javax.management.MBeanServerFactory;<br />import javax.management.ObjectName;<br />import javax.management.modelmbean.RequiredModelMBean;<br /><br />import com.sun.jdmk.comm.HtmlAdaptorServer;<br /><br />public class HelloAgent {<br />    public static void main(String[] args) throws Exception {<br />        MBeanServer server = MBeanServerFactory.createMBeanServer();<br />        ObjectName helloName = new ObjectName("chengang:name=HelloWorld");<br />        //Hello hello = new Hello();<br />        RequiredModelMBean hello = ModelMBeanUtils.createModlerMBean();<br />        server.registerMBean(hello, helloName);<br />        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");<br />        HtmlAdaptorServer adapter = new HtmlAdaptorServer();<br />        server.registerMBean(adapter, adapterName);<br />        adapter.start();<br />        System.out.println("start.....");<br />    }<br />}<br /><br /> <br />3、ModelMbeanUtils这个类是要我们自己来实现的，也是写model Bean最麻烦的地方，它主要是返回一个RequiredModelMBean类，此类主要包括了一个ModelMBeanInfo类的信息。在 ModelMBeanInfo中定义了所有对需要管理的属性和方法的描述。具体代码如下：<br /><br /><font color="#ff1493">import javax.management.Descriptor;<br />import javax.management.MBeanOperationInfo;<br /></font>import javax.management.MBeanParameterInfo;<br /><font color="#ff1493">import javax.management.modelmbean.DescriptorSupport;</font><br />import javax.management.modelmbean.ModelMBeanAttributeInfo;<br />import javax.management.modelmbean.ModelMBeanInfo;<br />import javax.management.modelmbean.ModelMBeanInfoSupport;<br />import javax.management.modelmbean.ModelMBeanOperationInfo;<br />import javax.management.modelmbean.RequiredModelMBean;<br />public class ModelMBeanUtils {<br />    private static final boolean READABLE = true;<br />    private static final boolean WRITABLE = true;<br />    private static final boolean BOOLEAN = true;<br />    private static final String STRING_CLASS = "java.lang.String";<br />    public static RequiredModelMBean createModlerMBean() {<br />        RequiredModelMBean model = null;<br />        try {<br />            model = new RequiredModelMBean();<br />            model.setManagedResource(new Hello(), "ObjectReference");<br />            ModelMBeanInfo info = createModelMBeanInfo();<br />            model.setModelMBeanInfo(info);<br />        } catch (Exception e) {<br />            e.printStackTrace();<br />        }<br />        return model;<br />    }<br />    private static ModelMBeanInfo createModelMBeanInfo() {<br />        //////////////////////////////////////////////////////////////////<br />        //                        属性                                        //<br />        //////////////////////////////////////////////////////////////////<br />        // 构造name属性信息<br /><font color="#ff1493">        Descriptor portAttrDesc = new DescriptorSupport();<br />        portAttrDesc.setField("name", "Name");<br />        portAttrDesc.setField("descriptorType", "attribute");<br />        portAttrDesc.setField("displayName", "Name");<br />        portAttrDesc.setField("getMethod", "getName");<br />        portAttrDesc.setField("setMethod", "setName");</font><br />        ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//<br />                "Name", // 属性名       <br />                STRING_CLASS, //属性类型    <br />                "people name", // 描述文字      <br />                READABLE, WRITABLE, !BOOLEAN, // 读写      <br />                <font color="#ff1493">portAttrDesc</font> // 属性描述子<br />        );<br />        //////////////////////////////////////////////////////////////////<br />        //                        方法                                        //<br />        //////////////////////////////////////////////////////////////////<br /><font color="#ff1493">        // 构造 getName操作描述符信息<br />        Descriptor getStateDesc = new DescriptorSupport(new String[] {<br />          "name=getName", "descriptorType=operation", "class=Hello",<br />          "role=operation" });</font></p>
		<p>
				<font color="#ff1493">        ModelMBeanOperationInfo getName = new ModelMBeanOperationInfo(//<br />          "getName", //<br />          "get name attribute", //<br />          null, //<br />          "java.lang.String", //<br />          MBeanOperationInfo.ACTION, //<br />          getStateDesc //<br />        );</font>
		</p>
		<p>
				<font color="#ff1493">        // 构造 setName操作描述符信息<br />        Descriptor setStateDesc = new DescriptorSupport(new String[] {<br />          "name=setName", "descriptorType=operation", "class=Hello",<br />          "role=operation" });</font>
		</p>
		<p>
				<font color="#ff1493">        MBeanParameterInfo[] setStateParms = new MBeanParameterInfo[] { (new MBeanParameterInfo(<br />          "name", "java.lang.String", "new name value")) };</font>
		</p>
		<p>
				<font color="#ff1493">        ModelMBeanOperationInfo setName = new ModelMBeanOperationInfo(//<br />          "setName", //<br />          "set name attribute", //<br />          setStateParms, //<br />          "void", //<br />          MBeanOperationInfo.ACTION, //<br />          setStateDesc //<br />        );</font>
				<br />
				<br />        //构造 printHello()操作的信息       <br />        ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//<br />                "printHello", //<br />                null, //  <br />                null, //<br />                "void", //  <br />                MBeanOperationInfo.INFO, //    <br />                null //<br />        );<br />        // 构造printHello(String whoName)操作信息     <br />        ModelMBeanOperationInfo print2Info;<br />        MBeanParameterInfo[] param2 = new MBeanParameterInfo[1];<br />        param2[0] = new MBeanParameterInfo("whoName", STRING_CLASS, "say hello to who");<br />        print2Info = new ModelMBeanOperationInfo(//<br />                "printHello", //<br />                null,//<br />                param2,//<br />                "void", //<br />                MBeanOperationInfo.INFO, //<br />                null//<br />        );<br />        //////////////////////////////////////////////////////////////////<br />        //                        最后总合                                    //<br />        //////////////////////////////////////////////////////////////////<br />        // create ModelMBeanInfo       <br />        ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//<br />                RequiredModelMBean.class.getName(), // MBean类<br />                null, // 描述文字     <br />                new ModelMBeanAttributeInfo[] { // 所有的属性信息（数组）<br />                nameAttrInfo },//只有一个属性<br />                null, // 所有的构造函数信息  <br />                new ModelMBeanOperationInfo[] { // 所有的操作信息（数组）<br /><font color="#ff1493">                        getName, <br />                        setName,</font><br />                        print1Info,<br />                        print2Info },//<br />                null, // 所有的通知信息(本例无)<br />                null//MBean描述子<br />        );<br />        return mbeanInfo;<br />    }<br />}<br /> <br />4、看效果的方法和以前一样，运行HelloAgent，用浏览器打开：http://localhost:8082 。效果图和standard mbean一样，就不再帖出来了，去第一篇去看吧http://blog.sohu.com/members/somebody076/545896.html<br /> <br />二、总结<br />　<br />   我们发现模型Mbean(Model MBean)要比标准MBean(standard mbean)复杂多了，那有什么理由让我们选择使用模型MBean吗？我认为，最大的理由就是模型MBean可以动态配置。试想一下这个应用场景：由于安全或其他原因，系统要把某个MBean公开的可管理方法隐藏起来。这时，如果你是用标准MBean，这需要修改接口类，然后重新编译发布；如果用 Apache commons-modeler来写的模型MBean，则只需要修改XML文件就行了，不需要重新编译发布（可能要重启一下系统）。这就是模型Mbean 优势之所在了。<br />　<br />　细心的人会发现动态MBean和这一节的模型Mbean非常相似，但它们还是有很大不同的：动态MBean没有Hello类，它要自己实现Hello类中的方法逻辑。</p>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/66579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-08-30 10:04 <a href="http://www.blogjava.net/hengheng123456789/articles/66579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5、用Apache的commons-modeler来辅助开发JMX</title><link>http://www.blogjava.net/hengheng123456789/articles/66376.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Tue, 29 Aug 2006 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/66376.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/66376.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/66376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/66376.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/66376.html</trackback:ping><description><![CDATA[
		<font size="2">一、前言<br />　<br />　　每一个MBean都要有一个接口，比如前面的Hello要有一个HelloMBean接口。要多维护一个接口，的确是件麻烦的事。 Apache的commons-modeler利用JMX中的动态MBean原理很好的解决了这一问题，commons-modeler使用得我们可以只写Hello，而不用写HelloMBean这个接口。不过这是有代价的，它要求我们写一个mbean的xml描述文件（唉，少了一件事，却又多出另一件事来）。但commons-modeler还是有优点的，就是它让mbean的装配更加灵活，把多个mbean的装配都集中在一个XML文件里来了。<br />　　开始实例之前，你需要先去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（库）引用中。<br /> <br />二、HelloWorld实例<br /> <br /> 　我们以本系统的第一篇“1、JMX的Hello World”为例，来重新实现一次。<br />　<br />1、Hello.java的代码不变（注：为了在Eclipse上和原来的Hello文件放在不同的地方，我把新Hello放到了mbean.modelbean包），如下：<br /><br />package mbean.modelbean;<br /><br />import mbean.standard.HelloMBean;<br /><br />public class Hello implements HelloMBean {<br />    private String name;<br />    public String getName() {<br />        return name;<br />    }<br />    public void setName(String name) {<br />        this.name = name;<br />    }<br />    public void printHello() {<br />        System.out.println("Hello World, " + name);<br />    }<br />    public void printHello(String whoName) {<br />        System.out.println("Hello , " + whoName);<br />    }<br />}<br /><br /> <br />2、MBean不用写了，但需要写一个XML描述文件。文件名任取，这里取名为：mbeans-descriptors<br /><br />&lt;?xml version="1.0"?&gt;<br />&lt;mbeans-descriptors&gt;<br /> &lt;mbean name="Hello" description="the hello bean" domain="chengang" group="helloGroup" type="mbean.modelbean.Hello"&gt;<br />  &lt;attribute name="name" description="a name attribute" type="java.lang.String" writeable="true"/&gt;<br />  &lt;operation name="printHello" description="a operation to print hello" impact="INFO" returnType="String"/&gt;<br /> &lt;/mbean&gt;<br />&lt;/mbeans-descriptors&gt; <br /><br />这里只对&lt;mbean&gt;标签做一下说明：<br /><br />    * name mbean在xml中的唯一标识，不一定要和类同名<br />    * description　mbean的注释说明信息<br />    * domain mbean所属域<br />    * group mbean所属组<br />    * type mbean的类全名（包名＋类名）<br />    * classname 指定实现代理功能的ModelMbean的全名，如果不指定则默认为BaseModelMBean <br /><br />3、接下来改写HelloAgent<br /><br />package mbean.modelbean;<br /><br />import java.io.InputStream;<br />import javax.management.MBeanServer;<br />import javax.management.ObjectName;<br />import javax.management.modelmbean.ModelMBean;<br />import org.apache.commons.modeler.ManagedBean;<br />import org.apache.commons.modeler.Registry;<br />import com.sun.jdmk.comm.HtmlAdaptorServer;<br /><br />public class HelloAgent {<br />    public static void main(String[] args) throws Exception {<br />        //基于xml中的信息构建一个Registry<br />        Registry registry = Registry.getRegistry(null, null);<br />        InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");<br />        registry.loadMetadata(stream);<br />        stream.close();<br />        //由Registry得到一个MBeanServer<br />        MBeanServer server = registry.getMBeanServer();<br /><br />        //得到Hello在描述文件中的信息类，对应于xml文件&lt;mbean&gt;标签的name属性。<br />        ManagedBean managed = registry.findManagedBean("Hello");<br />        //创建ObjectName<br />        ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");<br />        //得到ModelMBean<br />        ModelMBean hello = managed.createMBean(new Hello());<br />        //注册MBean<br />        server.registerMBean(hello, helloName);<br /><br />        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");<br />        HtmlAdaptorServer adapter = new HtmlAdaptorServer();<br />        server.registerMBean(adapter, adapterName);<br />        adapter.start();<br />        System.out.println("start.....");<br />    }<br />}<br /><br />　<br />HelloAgent是效复杂的地方，我们来和以前的HelloAgent逐步比较一下，前后有什么不同：<br />（1）首先，新的HelloAgent需要将xml信息读入到Registry对象中，这是旧HelloAgent所没有的。<br /><br />Registry registry = Registry.getRegistry(null, null);<br />InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");<br />registry.loadMetadata(stream);<br />stream.close();<br /><br /> <br />（2）接着创建MBeanServer的方式也不同了<br />现在：MBeanServer server = registry.getMBeanServer();<br />以前: MBeanServer server = MBeanServerFactory.createMBeanServer();<br />　<br />（3）Hello相应的ObjectName创建也略不相同。主要是域名在XML描述文件里设置好了。<br />现在：ManagedBean managed = registry.findManagedBean("Hello");<br />     ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");<br />以前：ObjectName helloName = new ObjectName("chengang:name=HelloWorld")<br />　<br />（4）得到MBean的方式也不同，这里就是关键的不同点<br />现在：ModelMBean hello = managed.createMBean(new Hello());<br />以前：Hello hello = new Hello();<br />注意：为什么现在要比以前多一个createMbean步骤呢，就是因为现在的写法并没有写Mbean，所以需要动态才需要生成一个。而以前就直接把new Hello()注册到mbean server就可以了，server会自动找到它的HelloMBean接口文件。<br />　<br />　也就上面四点区别，其他代码完全一样。测试和查看效果的方法和以前一样，在此不累述了。<br /><br />　<br />　commons Modeler为Hello动态生成了一个MBean接口：BaseModelBean<br />　<br />参考资料<br />　　用Commons Modeler 开发JMX应用</font>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/66376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-08-29 11:09 <a href="http://www.blogjava.net/hengheng123456789/articles/66376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>4、动态MBean：DynamicMBean</title><link>http://www.blogjava.net/hengheng123456789/articles/66375.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Tue, 29 Aug 2006 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/66375.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/66375.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/66375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/66375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/66375.html</trackback:ping><description><![CDATA[
		<font size="2">一、前言<br />　<br />　　动态MBean是在运行期才定义它的属性和方法，也就是说它有什么属性和方法是可以动态改变的。动态MBean主要利用一些辅助类（构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfo）来完成这个功能，所有的动态MBean必须实现DynamicMBean接口。DynamicMBean写好后，使用方法和第一篇文章中普通的MBean一样。<br />　<br />　　给出一个动态MBean的实例，这个实例最初动态构了一个Name属性及一个print方法，当我们执行它的print方法之后，又给此MBean新增了一个print1方法。实例的代码如下：<br />二、实例<br />1、HelloDynamic类<br /><br />import java.lang.reflect.Constructor;<br />import java.util.Iterator;<br />import javax.management.Attribute;<br />import javax.management.AttributeList;<br />import javax.management.DynamicMBean;<br />import javax.management.MBeanAttributeInfo;<br />import javax.management.MBeanConstructorInfo;<br />import javax.management.MBeanException;<br />import javax.management.MBeanInfo;<br />import javax.management.MBeanNotificationInfo;<br />import javax.management.MBeanOperationInfo;<br />import javax.management.MBeanParameterInfo;<br />import javax.management.ReflectionException;<br /><br />/**<br /> * @author Sunny Peng<br /> * @author change by Chen.Gang, add a feature for dynamic add operation<br /> * @version 1.0<br /> */<br />public class HelloDynamic implements DynamicMBean {<br />    //这是我们的属性名称<br />    private String name;<br />    private MBeanInfo mBeanInfo = null;<br />    private String className;<br />    private String description;<br />    private MBeanAttributeInfo[] attributes;<br />    private MBeanConstructorInfo[] constructors;<br />    private MBeanOperationInfo[] operations;<br />    MBeanNotificationInfo[] mBeanNotificationInfoArray;<br /><br />    public HelloDynamic() {<br />        init();<br />        buildDynamicMBean();<br />    }<br /><br />    private void init() {<br />        className = this.getClass().getName();<br />        description = "Simple implementation of a dynamic MBean.";<br />        attributes = new MBeanAttributeInfo[1];<br />        constructors = new MBeanConstructorInfo[1];<br />        operations = new MBeanOperationInfo[1];<br />        mBeanNotificationInfoArray = new MBeanNotificationInfo[0];<br />    }<br /><br />    private void buildDynamicMBean() {<br />        //设定构造函数<br />        Constructor[] thisconstructors = this.getClass().getConstructors();<br />        constructors[0] = new MBeanConstructorInfo("HelloDynamic(): Constructs a HelloDynamic object", thisconstructors[0]);<br />        //设定一个属性<br />        attributes[0] = new MBeanAttributeInfo("Name", "java.lang.String", "Name: name string.", true, true, false);<br />        //operate method 我们的操作方法是print<br />        MBeanParameterInfo[] params = null;//无参数<br />        operations[0] = new MBeanOperationInfo("print", "print(): print the name", params, "void", MBeanOperationInfo.INFO);<br />        mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);<br />    }<br /><br />    //动态增加一个print1方法<br />    private void dynamicAddOperation() {<br />        init();<br />        operations = new MBeanOperationInfo[2];//设定数组为两个<br />        buildDynamicMBean();<br />        operations[1] = new MBeanOperationInfo("print1", "print1(): print the name", null, "void", MBeanOperationInfo.INFO);<br />        mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);<br />    }<br /><br />    public Object getAttribute(String attribute_name) {<br />        if (attribute_name != null)<br />            return null;<br />        if (attribute_name.equals("Name"))<br />            return name;<br />        return null;<br />    }<br /><br />    public void setAttribute(Attribute attribute) {<br />        if (attribute == null)<br />            return;<br />        String Name = attribute.getName();<br />        Object value = attribute.getValue();<br />        try {<br />            if (Name.equals("Name")) {<br />                // if null value, try and see if the setter returns any exception<br />                if (value == null) {<br />                    name = null;<br />                    // if non null value, make sure it is assignable to the attribute<br />                } else if ((Class.forName("java.lang.String")).isAssignableFrom(value.getClass())) {<br />                    name = (String) value;<br />                }<br />            }<br />        } catch (Exception e) {<br />            e.printStackTrace();<br />        }<br />    }<br /><br />    public AttributeList getAttributes(String[] attributeNames) {<br />        if (attributeNames == null)<br />            return null;<br />        AttributeList resultList = new AttributeList();<br />        // if attributeNames is empty, return an empty result list<br />        if (attributeNames.length == 0)<br />            return resultList;<br />        for (int i = 0; i &lt; attributeNames.length; i++) {<br />            try {<br />                Object value = getAttribute(attributeNames[i]);<br />                resultList.add(new Attribute(attributeNames[i], value));<br />            } catch (Exception e) {<br />                e.printStackTrace();<br />            }<br />        }<br />        return resultList;<br />    }<br /><br />    public AttributeList setAttributes(AttributeList attributes) {<br />        if (attributes == null)<br />            return null;<br />        AttributeList resultList = new AttributeList();<br />        // if attributeNames is empty, nothing more to do<br />        if (attributes.isEmpty())<br />            return resultList;<br />        // for each attribute, try to set it and add to the result list if successfull<br />        for (Iterator i = attributes.iterator(); i.hasNext();) {<br />            Attribute attr = (Attribute) i.next();<br />            try {<br />                setAttribute(attr);<br />                String name = attr.getName();<br />                Object value = getAttribute(name);<br />                resultList.add(new Attribute(name, value));<br />            } catch (Exception e) {<br />                e.printStackTrace();<br />            }<br />        }<br />        return resultList;<br />    }<br /><br />    public Object invoke(String operationName, Object params[], String signature[]) throws MBeanException, ReflectionException {<br />        // Check for a recognized operation name and call the corresponding operation<br />        if (operationName.equals("print")) {<br />            //具体实现我们的操作方法print <br />            System.out.println("Hello, " + name + ", this is HellDynamic!");<br />            dynamicAddOperation();<br />            return null;<br />        } else if (operationName.equals("print1")) {<br />            System.out.println("这是动态增加的一方法print1");<br />            return null;<br />        } else {<br />            // unrecognized operation name:<br />            throw new ReflectionException(new NoSuchMethodException(operationName), "Cannot find the operation " + operationName + " in " + className);<br />        }<br /><br />    }<br /><br />    public MBeanInfo getMBeanInfo() {<br />        return mBeanInfo;<br />    }<br />}<br /><br /> <br />说明：<br /><br />    * 实现于接口DynamicMBean<br />    * 借助于各种辅助类完成一个类的构造。构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfo<br />    * 这里所有public方法是实现于DynamicMBean的。主要提供：setAttribute设置属性、 getAttribute取得属性、setAttributes设置一组属性、getAttributes取得一组属性、invoke方法调用、 getMBeanInfo　MBeanServer由这个方法得到关键的MBean类的构造信息。<br /><br />2、HelloAgent类<br />　　<br />　　前面说了HelloDynamic和普通MBean的使用方法是一样的，因此HelloAgent和第一篇的HelloAgent基本一样，就是把Hello改成HelloDynamic而已。为了实例完整，也一并帖出来吧。<br /><br />import javax.management.MBeanServerFactory;<br />import javax.management.ObjectName;<br />import com.sun.jdmk.comm.HtmlAdaptorServer;<br />public class HelloAgent {<br />    public static void main(String[] args) throws Exception {<br />        MBeanServer server = MBeanServerFactory.createMBeanServer();<br />        ObjectName helloName = new ObjectName("chengang:name=HelloDynamic");<br />        HelloDynamic hello = new HelloDynamic();<br />        server.registerMBean(hello, helloName);<br />        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");<br />        HtmlAdaptorServer adapter = new HtmlAdaptorServer();<br />        server.registerMBean(adapter, adapterName);<br />        adapter.start();<br />        System.out.println("start.....");<br />    }<br />}<br /><br />　<br />3、运行<br />　<br />　　先运行HelloAgent。再打开浏览器，输入网址：http://localhost:8082/。单击进入“name=HelloDynamic ”项，执行print方法后再回到上一页面你会发现又多了一个print1方法。<br />　<br />4、总结<br />　　动态MBean的代码稍显复杂，但对于一些特殊需求的情况，它将显示出强大威力。而且它还是模型MBeans（Model MBeans）的基础。不过在一般的项目中，动态MBean还是用得比较少，所谓利器深藏之而不用，非常时方现光芒。</font>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/66375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-08-29 11:07 <a href="http://www.blogjava.net/hengheng123456789/articles/66375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3、Notification的使用</title><link>http://www.blogjava.net/hengheng123456789/articles/66095.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Mon, 28 Aug 2006 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/66095.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/66095.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/66095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/66095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/66095.html</trackback:ping><description><![CDATA[
		<font size="2">一、简介<br />　<br />　　Mbean之间的通信是必不可少的，Notification就起到了在Mbean之间沟通桥梁的作用。JMX notification 由四部分组成：<br /><br />    * Notification 这个相当于一个信息包，封装了需要传递的信息<br />    * Notification broadcaster　这相当于一个广播器，把消息广播出去<br />    * Notification listerner　这是一个监听器，用于监听广播出来的Notification消息<br />    * Notification filter　这是一个过滤器，过滤掉不需要的Notification消息<br /><br />　 Notification broadcaster不需要我们实现，JMX的内部已经有了。Notification filter一般也很少用。下面的例子主要用到了Notification、Notification listerner。<br /><br />二、实例<br />　<br />　　在第一篇的Hello中有一个printHello(String whoName)方法，意思根据碰到的是谁来打招呼，比如：<br /> 　<br />　　Jack从对面走过来，说：“hi”<br />　　我们回之以礼，说：“Hello, jack”<br />　<br />　　首先这需要Jack先说一个hi（相应一个操作方法），然后他说的话封装成声波（相当Notification消息包）传递出去。然后我们还要给Jakc装上一个监听器（Hello的耳朵？？^_^），这个监听器将捕捉到Jack的声波语音包，并进行相应处理，即说“Hello, jack”。<br />　<br />　　好，我们看看如何实现的：<br />　<br />1、Jack类及其相应的MBean<br /> <br />   我们把Jack写成一个MBean，如下： <br /><br />import javax.management.Notification;<br />import javax.management.NotificationBroadcasterSupport;<br /><br />public class Jack extends NotificationBroadcasterSupport implements JackMBean {<br />    private int seq = 0;<br />    public void hi() {<br />        Notification n = new Notification(//创建一个信息包<br />                "jack.hi",//给这个Notification起个名称<br />                this, //由谁发出的Notification<br />                ++seq,//一系列通知中的序列号,可以设任意数值<br />                System.currentTimeMillis(),//发出时间<br />                "Jack");//发出的消息文本<br />        //发出去<br />        sendNotification(n);<br />    }<br />}<br /><br /> <br /> 说明：<br /><br />    * 必需继承NotificationBroadcasterSupport<br />    * 此类只有一个hi方法，方法只有两句：创建一个Notification消息包，然后将包发出去<br />    * 如果你还要在消息包上附加其他数据，Notification还有一个setUserData方法可供使用<br /><br />2、接下来是他的MBean <br /><br />public interface JackMBean {<br />    public void hi();<br />}<br /><br /> <br />3、创建一个Listener，监听到的Notification消息包将由此类负责处理。<br /> <br /><br />import javax.management.Notification;<br />import javax.management.NotificationListener;<br />public class HelloListener implements NotificationListener {<br />    public void handleNotification(Notification n, Object handback) {<br />        System.out.println("type=" + n.getType());<br />        System.out.println("source=" + n.getSource());<br />        System.out.println("seq=" + n.getSequenceNumber());<br />        System.out.println("send time=" + n.getTimeStamp());<br />        System.out.println("message=" + n.getMessage());<br /><br />        if (handback != null) {<br />            if (handback instanceof Hello) {<br />                Hello hello = (Hello) handback;<br />                hello.printHello(n.getMessage());<br />            }<br />        }<br />    }<br />}<br /><br /> <br />4、修改HelloAgent如下（加上了红色的三句）：<br /><br />import javax.management.MBeanServer;<br />import javax.management.MBeanServerFactory;<br />import javax.management.ObjectName;<br />import com.sun.jdmk.comm.HtmlAdaptorServer;<br />public class HelloAgent {<br />    public static void main(String args[]) throws Exception{<br />        MBeanServer server = MBeanServerFactory.createMBeanServer();<br />        ObjectName helloName = new ObjectName("chengang:name=HelloWorld");<br />        Hello hello=new Hello();<br />        server.registerMBean(hello, helloName);<br />        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");<br />        HtmlAdaptorServer adapter = new HtmlAdaptorServer();<br />        server.registerMBean(adapter, adapterName);<br />        Jack jack = new Jack();<br />        server.registerMBean(jack, new ObjectName("HelloAgent:name=jack"));<br />        jack.addNotificationListener(new HelloListener(), null, hello);<br />        adapter.start();<br />        System.out.println("start.....");<br />    }<br />}<br /><br /> <br />三、运行 <br />1、先运行HelloAgent启动服务，再打开浏览器输入网址：http://localhost:8082/<br /> <br />2、　进入“name=jack”项，然后单击“hi”按钮来执行它。这时Eclipse的console视图<br />四、总结<br /><br />　　Notification和Java的事件模型是一样的，另外如果你买了《Eclipse从入门到精通》，你会发现第22.4节也使用了和Notification和Java的事件模型相同的设计方式。Notification在我们的实际项目中也用到了，象我们现在的给移动做的项目中（基于JMX实现)，分散在各地方的工作站的日志，就是通过Notification方式，把每条产生的日志封装在 Notification中实时发回主控服务器的。有机会我会发这一系统的关于日志的设计方案写一下，它实现了对各地工作站的集中的、实时的监控，非常实用。</font>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/66095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-08-28 09:30 <a href="http://www.blogjava.net/hengheng123456789/articles/66095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2、JMX简介</title><link>http://www.blogjava.net/hengheng123456789/articles/66093.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Mon, 28 Aug 2006 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/66093.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/66093.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/66093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/66093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/66093.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">一、JMX简介</font>
		</p>
		<p>
				<font size="2">　　JMX是一种JAVA的正式规范，它主要目的是让程序且有被管理的功能，那么怎么理解所谓的“被管理”呢？试想你开发了一个软件（如ＷＥＢ网
站），它是在２４小时不简断运行的，那么你可能会想要“监控”这个软件的运行情况，比如收到了多少数据，有多少人登录等等。或者你又想“配置”这个软件，
比如现在访问人数比较多，你想把数据连接池设置得大一些。</font>
		</p>
		<p>
				<font size="2">　　当然，你也许会专门为这些管理来开发软件，但如果你借助JMX，则会发现创建这样的管理程序是如此简单。因为你无需为管理程序来开发界面，已经
有通用的JMX管理软件，如MC4J，或者是用一般都附带提供的HTML网页来管理，你要做的仅仅是将自己要被管理和监控类的按照JMX规范修改一下即
可。</font>
		</p>
		<p>
				<font size="2">　　中间件软件WebLogic的管理页面就是基于JMX开发的，而JBoss则整个系统都基于JMX构架。下面将JMX的一些概念，从JMX规范转帖如下：</font>
		</p>
		<p>
				<font size="2">二、JMX构架中的各层及相关的组件</font>
		</p>
		<ol>
				<li>
						<font size="2">工具层（Instrumentation Level）<br />    (a) MBeans（标准的，动态的，开放的和模型MBeans）<br />    (b) 通知模型：Notification、NotificationListener等类<br />    (c) MBean元数据类：Attribute、Opreator等类 
</font>
				</li>
				<li>
						<font size="2">代理层（Agent Level）<br />    (a) MBean Server<br />    (b) 代理服务。如前一篇的HtmlAdaptorServer等。</font>
				</li>
		</ol>
		<p>
				<font size="2">　　MBean中有getter和setter的就是属性，如前一篇的Hello类中Name。如果只有getter则表示该属性只读。一共有四种MBean，如下：</font>
		</p>
		<ol>
				<li>
						<font size="2">标准MBeans（Standard MBeans）设计和实现是最简单的，这类MBean使用自己的方法名作为管理接口； 
</font>
				</li>
				<li>
						<font size="2">动态MBeans（Dynamic MBeans）必须实现一个指定的接口，由于动态MBeans在运行期间暴露它们的管理接口，因此更为灵活； 
</font>
				</li>
				<li>
						<font size="2">开放MBeans（Open MBeans）属于动态MBeans，这类MBean依靠基础数据类型来实现通用管理，并为友情用户进行自我声明； 
</font>
				</li>
				<li>
						<font size="2">模型MBeans（Model MBeans）同样也是动态MBeans，这类MBeans是完全可配置的，在运行期间进行自我声明；它们为资源动态工具提供一个一般性的，有默认行为的MBeans类。</font>
				</li>
		</ol>
		<div>
				<font size="2">　　在前一篇中的Hello、HelloMBean就是一个标准MBeans（Standard MBeans）。后面接下来的几篇，我们会继续介绍其他几种MBean。</font>
		</div>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/66093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-08-28 09:28 <a href="http://www.blogjava.net/hengheng123456789/articles/66093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1、JMX的Hello World</title><link>http://www.blogjava.net/hengheng123456789/articles/65690.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Fri, 25 Aug 2006 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/articles/65690.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/65690.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/articles/65690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/65690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/65690.html</trackback:ping><description><![CDATA[
		<font size="2"> 一、JMX简介<br /><br />　　什么是JMX？在一篇网文中是这样说的："JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务，实际上，用户可以在任何Java应用程序中使用这些代理和服务实现管理"，这句话我现在看着还是不知所云，云里雾里。<br /><br />　　我们还是从JMX能给我们提供什么好处入手来理解吧。举一个应用实例：在一个系统中常常会有一些配置信息，比如服务的IP地址，端口号什么的，那么如何来写这些代码呢？<br /><br />   1. 程序初哥一般是写死在程序里，到要改变时就去改程序，然后再编译发布；<br />   2. 程序熟手则一般把这些信息写在一个配置文件里（JAVA一般都是*.properties文件），到要改变时只要改配置文件，但还是重新启动系统，以便读取配置文件里的新值；<br />   3. 程序好手则会写一个段代码，把配置值缓存起来，系统在读值的时候，先看看配置文件有没有更动。如有更改则重读一遍，否则从缓存里读取值<br />   4. 程序高手则懂得取物为我所用，用JMX！把配置属性集中在一个类，然后写一个叫MBean的东东，再配置一下就轻松搞定了。而且JMX自动提供了一个WEB页面来给你来改变这些配置信息。<br /><br />二、准备工作<br /><br /><br />　　JMX是一份规范，SUN依据这个规范在JDK（1.3、1.4、5.0）提供了JMX接口。而根据这个接口的实现则有很多种，比如Weblogic的JMX实现、MX4J、JBoss的JMX实现。在SUN自己也实现了一份，不过在JDK1.4之前，这件JMX实现（一些JAR包）是可选的，你得去它的网站上下载。JDK5.0则内嵌了进来，安装JDK5.0就可以开发基于JMX的代码了。<br />　　但JDK5.0并非包含所有SUN的关于JMX的代码，有一些工具类是排除在JDK5.0之外的。下面根据所使用的JDK版本情况，谈一谈开发环境的准备。<br />1、JDK1.3、1.4<br />　　去SUN网站下载SUN的JMX实现，共两个ZIP文件，下载网址：http://java.sun.com/products/JavaManagement/download.html。<br />（1）jmx-1_2_1-ri.zip<br />　　　解压后的lib目录包含：jmxri.jar、jmxtools.jar<br />（2）jmx_remote-1_0_1_03-ri.zip<br />　　　解压后的lib目录包含：jmxremote.jar、jmxremote_optional.jar、rmissl.jar<br />　　如果在DOS下用命令行开发，则把这五个JAR包加入到classpath系统变量中。如果你用Eclipse开发，则把JAR包加入到项目属性的Libratries（库）引用中。<br />2、JDK5.0<br />　　JDK5.0的jre\lib\rt.jar已经包含了jmxri.jar、jmxremote.jar、rmissl.jar三个包的代码。如果你用到jmxtools.jar、jmxremote_optional.jar的类，则需要将这两个类加入到classpath或 Eclipse的项目库引用中。<br />3、我使用的开发环境：JDK5.0 ＋ Eclipse3.2。<br />　　注：因为用到jmxtools.jar中的HtmlAdaptorServer类，所以将此包加入到项目库引用中。jmxremote_optional.jar暂时不用到，不管它。<br /><br />三、HelloWorld实例<br />1、Hello是一个需要被管理的类（普通类）<br /></font>
		<hr size="2" width="100%" />
		<font size="2">
				<br />/**<br /> * @author ChenGang 2005-12-3<br /> */<br />public class Hello implements HelloMBean {<br />    private String name;<br />    public String getName() {<br />        return name;<br />    }<br />    public void setName(String name) {<br />        this.name = name;<br />    }<br />    public void printHello() {<br />        System.out.println("Hello World, " + name);<br />    }<br />    public void printHello(String whoName) {<br />        System.out.println("Hello , " + whoName);<br />    }<br />}                                <br /></font>
		<hr size="2" width="100%" />
		<font size="2">
				<br />2、要管理Hello则必须创建一个相应MBean，如下：<br /></font>
		<hr size="2" width="100%" />
		<font size="2">
				<br />/**<br /> * @author ChenGang 2005-12-3<br /> */<br />public interface HelloMBean {<br />    public String getName();<br />    public void setName(String name);<br />    public void printHello();<br />    public void printHello(String whoName);<br />} <br /></font>
		<hr size="2" width="100%" />
		<font size="2">                            <br /><br />说明：包含在MBean中方法都将是可以被管理的。MBean起名是有规范的，就是原类名后加上MBean字样。<br />　<br />3、创建一个Agent类<br /></font>
		<hr size="2" width="100%" />
		<font size="2">
				<br />import javax.management.MBeanServer;<br />import javax.management.MBeanServerFactory;<br />import javax.management.ObjectName;<br />import com.sun.jdmk.comm.HtmlAdaptorServer;<br /><br />public class HelloAgent {<br /><br />    public static void main(String[] args) throws Exception {<br />        MBeanServer server = MBeanServerFactory.createMBeanServer();<br /><br />        ObjectName helloName = new ObjectName("chengang:name=HelloWorld");<br />        server.registerMBean(new Hello(), helloName);<br /><br />        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");<br />        HtmlAdaptorServer adapter = new HtmlAdaptorServer();<br />        server.registerMBean(adapter, adapterName);<br /><br />        adapter.start();<br />        System.out.println("start.....");<br /><br />    }<br />} <br /></font>
		<hr size="2" width="100%" />
		<font size="2">
				<br />说明：<br /><br />    * 先创建了一个MBeanServer，用来做MBean的容器<br />    * 将Hello这个类注入到MBeanServer中，注入需要创建一个ObjectName类<br />    * 创建一个AdaptorServer，这个类将决定MBean的管理界面，这里用最普通的Html型界面。AdaptorServer其实也是一个MBean。<br />    * chengang:name=HelloWorld的名字是有一定规则的，格式为：“域名:name=MBean名称”，域名和MBean名称都可以任意取。<br /><br />4、运行HelloAgent，然后打开网页：http://localhost:8082/<br />    单击“name=HelloWorld”链接进入<br />   <br /><br />五、总结<br /><br />　　在实际系统中我们可以把name变成决定数库链接池的变量，这样我就可以对系统的运行参数进行实现的监控和配置（管理）。而且也可以对一些方法（如printHello）进行远程调用了。<br /><br /></font>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/65690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2006-08-25 10:00 <a href="http://www.blogjava.net/hengheng123456789/articles/65690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>