??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲色一区二区三区,亚洲午夜精品一区二区,久久九九亚洲精品http://m.tkk7.com/hengheng123456789/category/14364.htmlzh-cnTue, 13 Mar 2007 07:00:09 GMTTue, 13 Mar 2007 07:00:09 GMT60利用JBossMX开发标准MBeanQ经典!转)(j)http://m.tkk7.com/hengheng123456789/articles/89227.html哼哼哼哼Thu, 21 Dec 2006 03:05:00 GMThttp://m.tkk7.com/hengheng123456789/articles/89227.htmlhttp://m.tkk7.com/hengheng123456789/comments/89227.htmlhttp://m.tkk7.com/hengheng123456789/articles/89227.html#Feedback0http://m.tkk7.com/hengheng123456789/comments/commentRss/89227.htmlhttp://m.tkk7.com/hengheng123456789/services/trackbacks/89227.html利用 JBossMX 开发标?/span> MBean

原文Q?a >http://www.ebook520.com/showbooktext.asp?id=2090&backcolor=E7F4FE&backsize=15Q?br />
   JBoss
服务器是建立?/span> JBoss ?/span> JMX 实现工具Q?/span> JBossMX Q基上的Q访?/span> JBoss |站Q?/span> http://www.jboss.org Q可以下载到独立?/span> JBoss JMX 实现工具软g?/span> 。将下蝲到的 jbossmx-1.1.2.zip 压羃包解压之后,把下?/span> jar 文gd?/span> CLASSPATH 中:(x)

jbossmx-1.1.2/jbossmx-1.1.2/lib/jboss-jmx.jar

jbossmx-1.1.2/jbossmx-1.1.2/lib/jboss-jmx-core.jar

JBOSS_HOME/client/gnu-regexp.jar

JBOSS_HOME/client/jbossall-client.jar

标准

MBean ?/span> JBoss 中用范围最q, JBoss 中的许多lg都是利用标准 MBean 开发的?/span>

1 Q计数器 MBean

下面是一个计数器 MBean 的开发示例?/span>

Q?/span> 1 Q确?/span> MBean 的接口?/span>

分析计数器的功能Q确定了(jin)两个Ҏ(gu)Q?/span> ?/span> add() ?/span> get() Q?/span> add() 负责加数Q?/span> get() ?/span> 责加数ƈ取回LQ?/span>

package com.liuyang.jmx.mbeans.counter;

public interface CounterMBean {

    public void add(int num);

    public int get(int num);   

}

从代码中可以看到Q开发标?/span> MBean ?/span> MBean 接口和开发普通接口除?jin)需要在 MBean cdU后面加上?/span> MBean ”之外,没有其他区别?/span>

Q?/span> 2 Q实?/span> MBean 接口?/span>

CounterMBean 是一个标?/span> MBean Q所?/span> MBean 实现cȝ名称必须?/span> MBean 接口 之间遵守标准 MBean 的命名规范,所?/span> CounterMBean 的实现类 Counter ?/span> CounterMBean 了(jin)N?/span> MBean 部分Q下面是 Counter 的实C码:(x)

package com.liuyang.jmx.mbeans.counter;

public class Counter implements CounterMBean {

                    int sum = 0;

public void add(int num) {

sum+=num;

}

public int get(int num) {

sum+=num;

return sum;

}

}

从代码中也可以看刎ͼ标准 MBean 实现cM普通的 Java E序也没什么区别?/span>

Q?/span> 3 Q利?/span> JMX API ~写调用 CounterMBean 的程序?/span>

JMX API ?/span> Sun 公司?/span> JMX 技术所设计的一套用来开?/span> JMX 应用的编E接口,通过 JMX API 可以理和控制前面开发的 CounterMBean 资源。下面是利用 JMX API ~写调用 CounterMBean 的程序代码:(x)

package com.liuyang.jmx.mbeans.counter;

import javax.management.MBeanServer;

import javax.management.MBeanServerFactory;

import javax.management.ObjectName;

public class CounterServer {

     public static void main(String[] args) throws Exception {

MBeanServer server = MBeanServerFactory.createMBeanServer();

ObjectName name = new ObjectName("book.liuyang:service=Counter");

server.registerMBean(new Counter(), name);   

String[] sig1 = {"int"};

Object[] opArgs1 = {new Integer(3)};

Object result1 = server.invoke(name, "add", opArgs1, sig1);

System.out.println(result1);     

 

String[] sig2 = {"int"};

Object[] opArgs2 = {new Integer(0)};

Object result2 = server.invoke(name, "get", opArgs2, sig2);

System.out.println(result2);             

}

}

2 Q?/span> ObjectName

ObjectName 代表一?/span> MBean 对象的名Q创Z?/span> ObjectName 需要符?/span> MBean 的命名规范,例如Q?/span>

ObjectName name = new ObjectName("book.liuyang:service=Counter");

3 Q?/span> MBeanServer

?/span> CounterServer E序中,首先创徏?/span> MBeanServer q个对象代表前文中介l的 MBean 服务器,它负责管?/span> MBean 资源Q每?/span> MBean 资源可以被注册到 MBeanServer 之中Q?/span>

server.registerMBean(new Counter(), name);

通过 MBeanServer ?/span> invoke Ҏ(gu)q可以调用一?/span> MBean Q在调用旉要传递一些与调用有关的参敎ͼ(x)

Object result1 = server.invoke(name, "add", opArgs1, sig1);

其中Q?/span>

name 是被调用对象的对象名?/span>

"add" 要求 调用被调对象的方法名U?/span>

opArgs1 是一个数l,包含着的每个数据将被作为参C递到被调Ҏ(gu)?/span>

sig1 ?/span> 一个数l,包含着被作ؓ(f)参数传递的每个数据的数据类型?/span>

调用之后q回的对象包含着执行的结果?/span>

4 Q?/span> MBeanServerFactory

MBeanServerFactory 是?/span> MBeanServer 的工厂类Q用的 JMX 实现工具不同Q通过 MBeanServerFactory 创徏?/span> MBeanServer 实现对象也不同。如?/span> MBeanServer 已经被创Z(jin)Q那么可以通过下面的方法获取:(x)

MBeanServer server = MBeanServerFactory.newMBeanServer();

通过q个实例Q可以了(jin)解到使用 MBeanServer 来控?/span> MBean 的基本方法,下面?/span> 用户查询 MBean 进一步介l通过 MBeanServer ?/span> MBean 的属性进行查询的Ҏ(gu)?/span>

5 Q用h?/span> MBean

首先Q确?/span> MBean 的接口?/span>

用户查询 MBean 中的用户是这?/span> MBean 所代表的对象,q个设计的用户包括名U和角色Q在q个例子中将对这两个属性进行监控,q是 JMX 为开发者提供的一U机Ӟ所有被理?/span> MBean 都在 MBeanServer 的控制之中,q个控制不仅包括上个计数器实例中所演示的方法调用功能,也包含对q些 MBean 的相关信息进行考察的功能?/span>

package com.liuyang.jmx.mbeans.user;

public interface UserMBean {

    public String getName();

    publicvoid setName(String name);

    public String getRole();

    public void setRole(String string);

}

UserMBean 中被讑֮?jin)两个属性:(x) name ?/span> role Qƈ늅 Java Bean 的规则ؓ(f)它们提供?/span> get() ?/span> set() Ҏ(gu)。通过q两个方法可以设?/span> UserMBean 的两个属性?/span>

package com.liuyang.jmx.mbeans.user;

public class User implements UserMBean  {

    private String name = "";

    private String password  = "";

    private String role  = "";

    public String getName() {

    return name;

    }

    publicvoid setName(String name) {

        this.name = name;

    }

public String getRole() {

return role;

}

public void setRole(String string) {

role = string;

}

}

User q个cd是以最单的方式实现?/span> UserMBean 接口?/span>

?/span> ?/span> ?/span> UserQueries 演示?/span> 通过 MBeanServer ?/span> MBean 的属性进行查询的Ҏ(gu)Q代码如下:(x)

package com.liuyang.jmx.mbeans.user;

import java.util.Iterator;

import java.util.Set;

import javax.management.Attribute;

import javax.management.MBeanServer;

import javax.management.MBeanServerFactory;

import javax.management.ObjectName;

import javax.management.Query;

import javax.management.QueryExp;

public class UserQueries {

  publicstaticvoid main(String[] args) throws Exception {

    MBeanServer server = MBeanServerFactory.createMBeanServer();

    ObjectName user1 = new ObjectName("book.liuyang:Name=user1");

    ObjectName user2 = new ObjectName("book.liuyang:Name=user2");

    server.createMBean("com.liuyang.jmx.mbeans.user.User", user1);

    server.createMBean("com.liuyang.jmx.mbeans.user.User", user2);

    server.setAttribute(user1, new Attribute("Name", "user1"));

    server.setAttribute(user2, new Attribute("Name", "user2"));

    server.setAttribute(user1, new Attribute("Role", "code"));

    server.setAttribute(user2, new Attribute("Role", "test"));

QueryExp exp = Query.match(Query.attr("Name"),Query.value("user1"));

ObjectName scope = new ObjectName("book.liuyang:*");   

Set set      = server.queryNames(scope, exp);   

Iterator it  = set.iterator();

System.out.println(" 下列 MBean 的名字是Q?/span> user1");

while (it.hasNext()) {

  System.out.println(it.next());   

}

scope = new ObjectName("book.liuyang:*");   

exp = Query.initialSubString(Query.attr("Role"),Query.value("t"));

set   = server.queryNames(scope, exp);   

it    = set.iterator();

System.out.println(" 下列 MBean 的角色是Q?/span> test");

while (it.hasNext()) {

  System.out.println(it.next());

}

}

}

?/span> UserQueries 中创Z(jin)两个 MBean 对象Q?/span>

server.createMBean("com.liuyang.jmx.mbeans.user.User", user1);

q是 MBeanServer 通过 MBean cȝ名称创徏 MBean 实例的方法?/span>

然后分别讄它们的属性:(x)

server.setAttribute(user1, new Attribute("Name", "user1"));

一?/span> Attribute 对象代表一个属性?/span>

JMX API 为查询服务徏立标准的接口Ҏ(gu)Q第一步是建立查询表达式:(x)

QueryExp exp = Query.match(Query.attr("Name"),Query.value("user1"));

q个查询表达式是以全匚w的方式进行的Q?/span> JMX q支持部分模p查询的功能Q?/span>

exp = Query.initialSubString(Query.attr("Role"),Query.value("t"));

initialSubString 建立的查询方法只?x)匹配名U的开始部分,在这里只要以?/span> t ”开头的值都?x)被匚w?/span>

然后Q通过一?/span> MBean 名称对象来代表查询范_(d)(x)

ObjectName scope = new ObjectName("book.liuyang:*");

最后,通过 MBeanServer 执行查询表达式的操作Q得到结果:(x)

Set set = server.queryNames(scope, exp);  

q行 UserQueries 可以得到查询l果?/span>



哼哼 2006-12-21 11:05 发表评论
]]>
开发Jboss Mbean服务http://m.tkk7.com/hengheng123456789/articles/87766.html哼哼哼哼Thu, 14 Dec 2006 10:03:00 GMThttp://m.tkk7.com/hengheng123456789/articles/87766.htmlhttp://m.tkk7.com/hengheng123456789/comments/87766.htmlhttp://m.tkk7.com/hengheng123456789/articles/87766.html#Feedback0http://m.tkk7.com/hengheng123456789/comments/commentRss/87766.htmlhttp://m.tkk7.com/hengheng123456789/services/trackbacks/87766.html众所周知Jboss依赖于JMX来装载MBean服务Q而这些MBean服务l成?jin)具体服务器实例的差异性。标准JBoss发布版本提供的所有功能都是基于MBean的。所以,如果要ؓ(f)JBoss服务器添加新的服务,最好的Ҏ(gu)是开发自qJMX MBean服务?br />MBean服务的生命周期是由如下三个JBoss MBean负责的:(x)SARDeployer、ServiceConfigurator、ServiceController?br />
如自定义MBean服务依赖于其他MBean服务Q可以通过如下Ҏ(gu)实现Q?br />1、在自定义MBean接口中添加Service中Q何方法?br />   q种方式避免?jin)对JBoss具体接口的依赖?br />2、ؓ(f)自定义MBean接口扩展org.jboss.system.Service接口?br />
3、ؓ(f)自定义MBean接口扩展org.jboss.system.ServiceMBean接口?br />   最单的办法是将自定义MBean接口l承于ServiceMBean接口Q将MBean实现cȝ承ServiceMBeanSupportcRServiceMBeanSupport已经实现?jin)ServiceMBean接口QServiceMBeanSupportq集成了(jin)日志、JBoss服务状态管理跟t功能,q些Ҏ(gu)需要我们具体实现createService、startService、stopService和destroyService中的部分Ҏ(gu)?br />
下面介绍ZServiceMBean接口和ServiceMBeanSupportcȝJNDIMapMBean接口?qing)其JNDIMap实现cR?br />
package org.joss.chap2.ex2;

import javax.naming.NamingException;

import org.jboss.system.ServiceMBean;

public interface JNDIMapMBean extends ServiceMBean
{
 public String getJndiName();
 public void setJndiName(String jndiName) throws NamingException;
}

package org.joss.chap2.ex2;

import java.util.HashMap;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NamingException;

import org.jboss.naming.NonSerializableFactory;
import org.jboss.system.ServiceMBeanSupport;

public class JNDIMap extends ServiceMBeanSupport implements JNDIMapMBean
{
 private String jndiName;
 private HashMap contextMap = new HashMap();

 public JNDIMap()
 {
  super();
  // TODO Auto-generated constructor stub
 }

 public String getJndiName()
 {
  
  return jndiName;
 }

 public void setJndiName(String jndiName) throws NamingException
 {
  String oldName = this.jndiName;
  this.jndiName = jndiName;
  if(super.getState()==STARTED)
  {
   unbind(oldName);
   try
   {
    rebind();
   }
   catch(Exception e)
   {
    NamingException ne = new NamingException("Failed to update jndiName");
    ne.setRootCause(e);
    throw ne;
   }
  }

 }
 
 public void startService()throws Exception
 {
  rebind();
 }
 
 
 public void stopService()
 {
  unbind(jndiName);
 }
 
 private void rebind() throws NamingException
 {
  I(yng)nitialContext rootCtx = new InitialContext();
  Name fullName = rootCtx.getNameParser("").parse(jndiName);
  NonSerializableFactory.rebind(fullName,contextMap,true);
 }
 
 private void unbind(String jndiName)
 {
  try
  {
   I(yng)nitialContext rootCtx = new InitialContext();
   rootCtx.unbind(jndiName);
   NonSerializableFactory.unbind(jndiName);
  }
  catch(NamingException e)
  {
   System.out.println(e);
  }
 }

 public String getName()
 {
  // TODO Auto-generated method stub
  return null;
 }

 public int getState()
 {
  // TODO Auto-generated method stub
  return 0;
 }

 public String getStateString()
 {
  // TODO Auto-generated method stub
  return null;
 }

 public void jbossInternalLifecycle(String arg0) throws Exception
 {
  // TODO Auto-generated method stub

 }

 public void create() throws Exception
 {
  // TODO Auto-generated method stub

 }

 public void start() throws Exception
 {
  // TODO Auto-generated method stub

 }

 public void stop()
 {
  // TODO Auto-generated method stub

 }

 public void destroy()
 {
  // TODO Auto-generated method stub

 }

 public ObjectName preRegister(MBeanServer arg0, ObjectName arg1)
   throws Exception
 {
  // TODO Auto-generated method stub
  return null;
 }

 public void postRegister(Boolean arg0)
 {
  // TODO Auto-generated method stub

 }

 public void preDeregister() throws Exception
 {
  // TODO Auto-generated method stub

 }

 public void postDeregister()
 {
  // TODO Auto-generated method stub

 }

}

<?xml version="1.0" encoding="UTF-8"?>

<server>

 <mbean code="org.joss.chap2.ex2.JNDIMap"
  name="chap2.ex2:service=JNDIMap">

  <attribute name="JndiName">inmemory/map/MapTest</attribute>
  <depends>jboss:service=Naming</depends>

 </mbean>

</server>



 



哼哼 2006-12-14 18:03 发表评论
]]>
ZJBoss来写MBean Q{Q?/title><link>http://m.tkk7.com/hengheng123456789/articles/87291.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Tue, 12 Dec 2006 08:40:00 GMT</pubDate><guid>http://m.tkk7.com/hengheng123456789/articles/87291.html</guid><wfw:comment>http://m.tkk7.com/hengheng123456789/comments/87291.html</wfw:comment><comments>http://m.tkk7.com/hengheng123456789/articles/87291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/hengheng123456789/comments/commentRss/87291.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/hengheng123456789/services/trackbacks/87291.html</trackback:ping><description><![CDATA[来源Q?a href="/chengang/archive/2006/03/07/34091.html">http://m.tkk7.com/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: ">规范Q这个实例是Z</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: ">Q我?/span><span><font face="Times New Roman">jboss-3.2.6</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">Q下载地址Q?/span><span><a ><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: ">包的支持Q?/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: ">Q如果你和我一L(fng)</span><span><font face="Times New Roman">Eclipse</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">来开发(推荐Q,那么把这个两个包加入到项目的库引用中Q加入到库引用的Ҏ(gu)参考前面两章)(j)?/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: ">的属性要需要经常进行改动配|的Q那么我们就把它写成一?/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: ">之前Q我们先需要写一?/span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">接口Q接口里的方法都是属性的</span><span><font face="Times New Roman">set/get</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">Ҏ(gu)。这个接口必ȝ承接?/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: ">实现c?/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: ">Q这个实现类q必ȝ?/span><span>ServiceMBeanSupport</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">cR?/span></font><font size="2"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">q种cd单不q了(jin)Q就是属性和相应?/span><span>set/get</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">Ҏ(gu)Q?/span><span>EJB</span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">中叫实体cR?/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"><?xml version="1.0" encoding="UTF-8"?><br /></font></span><span><font face="Courier New" size="2"><server><br /></font></span><span><font size="2"><font face="Courier New"><span style="mso-tab-count: 1">    </span><mbean code="example.mbean.HelloWorldService" name="www.chengang.com.cn:service=HelloWorld"><br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-tab-count: 2">        </span><attribute name="Message">Hello World</attribute><br /></font></font></span><span><font size="2"><font face="Courier New"><span style="mso-tab-count: 1">    </span></mbean><br /></font></font></span><span><font face="Courier New" size="2"></server></font></span></p></div><p><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: "><font size="2">说明Q?/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: ">Ҏ(gu)?/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: ">Ҏ(gu)一个名Uͼ格式一般是Q?/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: ">cd</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: ">是ؓ(f)属性设|初始|q样?/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: ">cLQ?/span><span><font face="Times New Roman">message</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">属性就有了(jin)一个初始?/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: ">的第一个字母必L大写?/span></font></p><h3 style="MARGIN: 12pt 0cm 6pt"><span><font face="宋体, MS Song" size="3">二、将实例部v到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: ">目录下创Z?/span><span><font face="Times New Roman">hello.sar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">目录Q然后创建如下目录文件结构:(x)</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: ">注意Q是</span><span><font face="Times New Roman">*.class</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">Q不?/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">其他说明Q?/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: ">文gQ放?/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: ">支持热部|Ԍ也就是说你在布置q个目录时ƈ不需要重?/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: ">打开|址Q?/span><span><a ><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: "> Q出C?/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: ">”项打开详细面如下Q?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: ">Q?/span><span><font face="Times New Roman">ChenGang</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">”,再单几Z?/span><span><font face="Times New Roman">Apply Changes</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">”应用修改,得到如下效果Q?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">其他cd何?/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: ">属性了(jin)Q接下来的问题是Q“在其他cM应该如何得到</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: ">的实例(单例模式Q)(j)Q也是说问题{成我们如何去取得q个唯一实例。例E如下:(x)</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: ">、创Z个用到</span><span><font face="Times New Roman">Message</font></span><span style="FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: ">属性的c?/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 ><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: ">注意Q?/span><span><font face="Times New Roman">go</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">Ҏ(gu)里是三句。第一句比较长Q它是根?/span><span><font face="Times New Roman">jboss-service.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">文g中设|的</span><span><font face="Times New Roman">MBean</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">名称Q来取得?/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: ">接口中加入一句:(x)</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: ">cM加入现实Ҏ(gu)Q?/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: ">文gQ?/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: ">Q更新到</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: ">讄面Q如下,发现多了(jin)一?/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: ">按钮Q得到如下的</span><span><font face="Times New Roman">DOS</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">输出Q?/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: ">本实例仅演示?jin)一?/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: ">中加入更多属性,别忘?jin)?/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: ">Ҏ(gu)?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: ">cd的,?/span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">也支持其他的cdQ甚x</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: ">信息Q这时属性类型要求是</span><span><font face="Times New Roman">org.w3c.dom.Element</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">Q?/span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">它?yu)装成?jin)一?/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: ">也是配|信息写在了(jin)一个文Ӟ</span><span><font face="Times New Roman">jboss-service.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">文gQ里嘛,相对于将配置文g写到</span><span><font face="Times New Roman">*.properties</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">文g的方式,它似乎也没什么新鲜的地方。但通过本章实例我们可以看到</span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">的一些好处:(x)我们不用写代码去读配|文件的信息Q而且</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: ">Q。更重要的是</span><span><font face="Times New Roman">JMX</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: ">q提供了(jin)一整套的属性之前互相访问、互相调用的功能Q这?/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">六、参考资料:(x)</font></span><span><a ><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://m.tkk7.com/hengheng123456789/aggbug/87291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/hengheng123456789/" target="_blank">哼哼</a> 2006-12-12 16:40 <a href="http://m.tkk7.com/hengheng123456789/articles/87291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>7、用JDK5.0的JConsole来连接MBeanhttp://m.tkk7.com/hengheng123456789/articles/66840.html哼哼哼哼Thu, 31 Aug 2006 04:55:00 GMThttp://m.tkk7.com/hengheng123456789/articles/66840.htmlhttp://m.tkk7.com/hengheng123456789/comments/66840.htmlhttp://m.tkk7.com/hengheng123456789/articles/66840.html#Feedback0http://m.tkk7.com/hengheng123456789/comments/commentRss/66840.htmlhttp://m.tkk7.com/hengheng123456789/services/trackbacks/66840.html前面所有看效果都是通过Html|页来看的。JDK5.0自带?jin)一个jmx客户端,叫jconsoleQ位于c:\jdk\bin\jconsole.exe。我们来用用q个客户端来q接Mbean Server?br /> 
一、vm参数方式
 
1、还是用W一的那个HelloAgentQ修改HelloAgentQ将W一句:(x)
MBeanServer server = MBeanServerFactory.createMBeanServer();
改ؓ(f)QMBeanServer server = ManagementFactory.getPlatformMBeanServer();
注:(x)ManagementFactory的全路径为:(x)java.lang.management.ManagementFactory
 
2、修改Eclipse的run选项Q把?Dcom.sun.management.jmxremote=HelloAgent”这一句加入到run选项?br /> 
3、运行HelloAgentQ然后在DosH口输入“jconsole”来启到JConsole
4、单几Z连接?br /> 
二、RMI方式
 
  q是用jconsoleQ但方式变了(jin)。这里不需要象上面那样修改Eclipse run的vm选项?br /> 
1、还是用W一的HelloAgentQ加上一D代码,启动一个JMXConnectorServer服务

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

import com.sun.jdmk.comm.HtmlAdaptorServer;

public class HelloAgent {
    public static void main(String args[]) throws Exception {
        MBeanServer server = MBeanServerFactory.createMBeanServer();
        ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
        Hello hello = new Hello();
        server.registerMBean(hello, helloName);
        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
        HtmlAdaptorServer adapter = new HtmlAdaptorServer();
        server.registerMBean(adapter, adapterName);
        adapter.start();
        System.out.println("start.....");

        // Create an RMI connector and start it
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
        JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
        cs.start();
        System.out.println("rmi start.....");
    }
}

  
2、在Dosq行一个命令:(x)rmiregistry 9999
 
3、运行HelloAgentQ然后再在dos下运行命令jconsole
输入service:jmx:rmi:///jndi/rmi://localhost:9999/server
 
三、ȝ
  q接MBeanServer的方式除?jin)Html、JConsoleQ还有一些第三方的客L(fng)Q比较有名的是MC4jQ通过q些客户端我们可以很Ҏ(gu)去访问MBean。这也就是我们ؓ(f)什么要用JMX的其中一个原因:(x)试想如果我自己搞一套标准,势必要自己开发一个客L(fng)Q那?x)是一个不的工作量?/font>

哼哼 2006-08-31 12:55 发表评论
]]>
6、模型BeanQModel Beanhttp://m.tkk7.com/hengheng123456789/articles/66579.html哼哼哼哼Wed, 30 Aug 2006 02:04:00 GMThttp://m.tkk7.com/hengheng123456789/articles/66579.htmlhttp://m.tkk7.com/hengheng123456789/comments/66579.htmlhttp://m.tkk7.com/hengheng123456789/articles/66579.html#Feedback4http://m.tkk7.com/hengheng123456789/comments/commentRss/66579.htmlhttp://m.tkk7.com/hengheng123456789/services/trackbacks/66579.html在上一节是用apache的commons-modeler来开发的一个modelQ只不过commons-modeler帮助我们实现?jin)很多的代码Q而我们只需要写描述XML文gp?jin)。这一节,来一个实打实的Model BeanQ不借助MW三方工具包。例子还是沿用Helloq个c,以便于和以前的实现相比较?br /> 
一、Model MBean实例
1、Hello.javaq是和以前的一栗这里它没有再加上一个MBean接口?jin),只是一个很普通的cR?br />
public class Hello{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void printHello() {
        System.out.println("Hello World, " + name);
    }
    public void printHello(String whoName) {
        System.out.println("Hello , " + whoName);
    }
}

 
2、接下来是HelloAgent的写法,和以前就差一句:(x)把“new Hello()”这一句删除了(jin)Q加上了(jin)ModelMbeanUtils.createModlerMbean();

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.modelmbean.RequiredModelMBean;

import com.sun.jdmk.comm.HtmlAdaptorServer;

public class HelloAgent {
    public static void main(String[] args) throws Exception {
        MBeanServer server = MBeanServerFactory.createMBeanServer();
        ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
        //Hello hello = new Hello();
        RequiredModelMBean hello = ModelMBeanUtils.createModlerMBean();
        server.registerMBean(hello, helloName);
        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
        HtmlAdaptorServer adapter = new HtmlAdaptorServer();
        server.registerMBean(adapter, adapterName);
        adapter.start();
        System.out.println("start.....");
    }
}

 
3、ModelMbeanUtilsq个cL要我们自己来实现的,也是写model Bean最ȝ(ch)的地方,它主要是q回一个RequiredModelMBeanc,此类主要包括?jin)一个ModelMBeanInfocȝ信息。在 ModelMBeanInfo中定义了(jin)所有对需要管理的属性和Ҏ(gu)的描q。具体代码如下:(x)

import javax.management.Descriptor;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.modelmbean.DescriptorSupport;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;
import javax.management.modelmbean.ModelMBeanOperationInfo;
import javax.management.modelmbean.RequiredModelMBean;
public class ModelMBeanUtils {
    private static final boolean READABLE = true;
    private static final boolean WRITABLE = true;
    private static final boolean BOOLEAN = true;
    private static final String STRING_CLASS = "java.lang.String";
    public static RequiredModelMBean createModlerMBean() {
        RequiredModelMBean model = null;
        try {
            model = new RequiredModelMBean();
            model.setManagedResource(new Hello(), "ObjectReference");
            ModelMBeanInfo info = createModelMBeanInfo();
            model.setModelMBeanInfo(info);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return model;
    }
    private static ModelMBeanInfo createModelMBeanInfo() {
        //////////////////////////////////////////////////////////////////
        //                        属性                                      ?//
        //////////////////////////////////////////////////////////////////
        // 构造name属性信?br />        Descriptor portAttrDesc = new DescriptorSupport();
        portAttrDesc.setField("name", "Name");
        portAttrDesc.setField("descriptorType", "attribute");
        portAttrDesc.setField("displayName", "Name");
        portAttrDesc.setField("getMethod", "getName");
        portAttrDesc.setField("setMethod", "setName");

        ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
                "Name", // 属性名       
                STRING_CLASS, //属性类型 ? 
                "people name", // 描述文字      
                READABLE, WRITABLE, !BOOLEAN, // d      
                portAttrDesc // 属性描q子
        );
        //////////////////////////////////////////////////////////////////
        //                        Ҏ(gu)                                        //
        //////////////////////////////////////////////////////////////////
        // 构?getName操作描述W信?br />        Descriptor getStateDesc = new DescriptorSupport(new String[] {
          "name=getName", "descriptorType=operation", "class=Hello",
          "role=operation" });

        ModelMBeanOperationInfo getName = new ModelMBeanOperationInfo(//
          "getName", //
          "get name attribute", //
          null, //
          "java.lang.String", //
          MBeanOperationInfo.ACTION, //
          getStateDesc //
        );

        // 构?setName操作描述W信?br />        Descriptor setStateDesc = new DescriptorSupport(new String[] {
          "name=setName", "descriptorType=operation", "class=Hello",
          "role=operation" });

        MBeanParameterInfo[] setStateParms = new MBeanParameterInfo[] { (new MBeanParameterInfo(
          "name", "java.lang.String", "new name value")) };

        ModelMBeanOperationInfo setName = new ModelMBeanOperationInfo(//
          "setName", //
          "set name attribute", //
          setStateParms, //
          "void", //
          MBeanOperationInfo.ACTION, //
          setStateDesc //
        );


        //构?printHello()操作的信息    ? 
        ModelMBeanOperationInfo print1Info = new ModelMBeanOperationInfo(//
                "printHello", //
                null, //  
                null, //
                "void", //  
                MBeanOperationInfo.INFO, //    
                null //
        );
        // 构造printHello(String whoName)操作信息     
        ModelMBeanOperationInfo print2Info;
        MBeanParameterInfo[] param2 = new MBeanParameterInfo[1];
        param2[0] = new MBeanParameterInfo("whoName", STRING_CLASS, "say hello to who");
        print2Info = new ModelMBeanOperationInfo(//
                "printHello", //
                null,//
                param2,//
                "void", //
                MBeanOperationInfo.INFO, //
                null//
        );
        //////////////////////////////////////////////////////////////////
        //                        最后d                                    //
        //////////////////////////////////////////////////////////////////
        // create ModelMBeanInfo       
        ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport(//
                RequiredModelMBean.class.getName(), // MBeanc?br />                null, // 描述文字     
                new ModelMBeanAttributeInfo[] { // 所有的属性信息(数组Q?br />                nameAttrInfo },//只有一个属?br />                null, // 所有的构造函C? 
                new ModelMBeanOperationInfo[] { // 所有的操作信息Q数l)(j)
                        getName, 
                        setName,

                        print1Info,
                        print2Info },//
                null, // 所有的通知信息(本例?
                null//MBean描述?br />        );
        return mbeanInfo;
    }
}
 
4、看效果的方法和以前一Pq行HelloAgentQ用览器打开Qhttp://localhost:8082 。效果图和standard mbean一P׃再帖出来?jin),ȝ一去看吧http://blog.sohu.com/members/somebody076/545896.html
 
二、ȝ
 
   我们发现模型Mbean(Model MBean)要比标准MBean(standard mbean)复杂多了(jin)Q那有什么理p我们选择使用模型MBean吗?我认为,最大的理由是模型MBean可以动态配|。试想一下这个应用场景:(x)׃安全或其他原因,pȝ要把某个MBean公开的可理Ҏ(gu)隐藏h。这Ӟ如果你是用标准MBeanQ这需要修Ҏ(gu)口类Q然后重新编译发布;如果?Apache commons-modeler来写的模型MBeanQ则只需要修改XML文gp?jin),不需要重新编译发布(可能要重启一下系l)(j)。这是模型Mbean 优势之所在了(jin)?br /> 
 l心(j)的h?x)发现动态MBean和这一节的模型Mbean非常怼Q但它们q是有很大不同的Q动态MBean没有Helloc,它要自己实现HellocM的方法逻辑?/p>

哼哼 2006-08-30 10:04 发表评论
]]>
5、用Apache的commons-modeler来辅助开发JMXhttp://m.tkk7.com/hengheng123456789/articles/66376.html哼哼哼哼Tue, 29 Aug 2006 03:09:00 GMThttp://m.tkk7.com/hengheng123456789/articles/66376.htmlhttp://m.tkk7.com/hengheng123456789/comments/66376.htmlhttp://m.tkk7.com/hengheng123456789/articles/66376.html#Feedback0http://m.tkk7.com/hengheng123456789/comments/commentRss/66376.htmlhttp://m.tkk7.com/hengheng123456789/services/trackbacks/66376.html一、前a
 
  每一个MBean都要有一个接口,比如前面的Hello要有一个HelloMBean接口。要多维护一个接口,的确是gȝ(ch)的事?Apache的commons-modeler利用JMX中的动态MBean原理很好的解决了(jin)q一问题Qcommons-modeler使用得我们可以只写HelloQ而不用写HelloMBeanq个接口。不q这是有代h(hun)的,它要求我们写一个mbean的xml描述文gQ唉Q少?jin)一件事Q却又多出另一件事来)(j)。但commons-modelerq是有优点的Q就是它让mbean的装配更加灵z,把多个mbean的装配都集中在一个XML文g里来?jin)?br />  开始实例之前,你需要先去apache|站下蝲commons-modelerQ以?qing)modeler的依赖项目commons-logging。下载网址为:(x)http://jakarta.apache.org/site/downloads/downloads_commons.htmlQ下载的文g是ZIP压羃包,解压后找到commons-logging.jar和commons-modeler.jar。如果在DOS下用命o(h)行开发,则把q两个JAR包加入到classpathpȝ变量中。如果你用Eclipse开发,则把JAR包加入到目属性的LibratriesQ库Q引用中?br /> 
二、HelloWorld实例
 
  我们以本pȝ的第一?、JMX的Hello World”ؓ(f)例,来重新实Cơ?br /> 
1、Hello.java的代码不变(注:(x)Z(jin)在Eclipse上和原来的Hello文g攑֜不同的地方,我把新Hello攑ֈ?jin)mbean.modelbean包)(j)Q如下:(x)

package mbean.modelbean;

import mbean.standard.HelloMBean;

public class Hello implements HelloMBean {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void printHello() {
        System.out.println("Hello World, " + name);
    }
    public void printHello(String whoName) {
        System.out.println("Hello , " + whoName);
    }
}

 
2、MBean不用写了(jin)Q但需要写一个XML描述文g。文件名dQ这里取名ؓ(f)Qmbeans-descriptors

<?xml version="1.0"?>
<mbeans-descriptors>
 <mbean name="Hello" description="the hello bean" domain="chengang" group="helloGroup" type="mbean.modelbean.Hello">
  <attribute name="name" description="a name attribute" type="java.lang.String" writeable="true"/>
  <operation name="printHello" description="a operation to print hello" impact="INFO" returnType="String"/>
 </mbean>
</mbeans-descriptors>

q里只对<mbean>标签做一下说明:(x)

    * name mbean在xml中的唯一标识Q不一定要和类同名
    * description mbean的注释说明信?br />    * domain mbean所属域
    * group mbean所属组
    * type mbean的类全名Q包名+cdQ?br />    * classname 指定实现代理功能的ModelMbean的全名,如果不指定则默认为BaseModelMBean

3、接下来改写HelloAgent

package mbean.modelbean;

import java.io.InputStream;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.modelmbean.ModelMBean;
import org.apache.commons.modeler.ManagedBean;
import org.apache.commons.modeler.Registry;
import com.sun.jdmk.comm.HtmlAdaptorServer;

public class HelloAgent {
    public static void main(String[] args) throws Exception {
        //Zxml中的信息构徏一个Registry
        Registry registry = Registry.getRegistry(null, null);
        InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
        registry.loadMetadata(stream);
        stream.close();
        //由Registry得到一个MBeanServer
        MBeanServer server = registry.getMBeanServer();

        //得到Hello在描q文件中的信息类Q对应于xml文g<mbean>标签的name属性?br />        ManagedBean managed = registry.findManagedBean("Hello");
        //创徏ObjectName
        ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
        //得到ModelMBean
        ModelMBean hello = managed.createMBean(new Hello());
        //注册MBean
        server.registerMBean(hello, helloName);

        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
        HtmlAdaptorServer adapter = new HtmlAdaptorServer();
        server.registerMBean(adapter, adapterName);
        adapter.start();
        System.out.println("start.....");
    }
}

 
HelloAgent是效复杂的地方,我们来和以前的HelloAgent逐步比较一下,前后有什么不同:(x)
Q?Q首先,新的HelloAgent需要将xml信息d到Registry对象中,q是旧HelloAgent所没有的?br />
Registry registry = Registry.getRegistry(null, null);
InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
registry.loadMetadata(stream);
stream.close();

 
Q?Q接着创徏MBeanServer的方式也不同?br />现在QMBeanServer server = registry.getMBeanServer();
以前: MBeanServer server = MBeanServerFactory.createMBeanServer();
 
Q?QHello相应的ObjectName创徏也略不相同。主要是域名在XML描述文g里设|好?jin)?br />现在QManagedBean managed = registry.findManagedBean("Hello");
     ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
以前QObjectName helloName = new ObjectName("chengang:name=HelloWorld")
 
Q?Q得到MBean的方式也不同Q这里就是关键的不同?br />现在QModelMBean hello = managed.createMBean(new Hello());
以前QHello hello = new Hello();
注意Qؓ(f)什么现在要比以前多一个createMbean步骤呢,是因ؓ(f)现在的写法ƈ没有写MbeanQ所以需要动态才需要生成一个。而以前就直接把new Hello()注册到mbean server可以了(jin)Qserver?x)自动找到它的HelloMBean接口文g?br /> 
 也就上面四点区别Q其他代码完全一栗测试和查看效果的方法和以前一P在此不篏qC(jin)?br />
 
 commons Modeler为Hello动态生成了(jin)一个MBean接口QBaseModelBean
 
参考资?br />  用Commons Modeler 开发JMX应用

哼哼 2006-08-29 11:09 发表评论
]]>
4、动态MBeanQDynamicMBeanhttp://m.tkk7.com/hengheng123456789/articles/66375.html哼哼哼哼Tue, 29 Aug 2006 03:07:00 GMThttp://m.tkk7.com/hengheng123456789/articles/66375.htmlhttp://m.tkk7.com/hengheng123456789/comments/66375.htmlhttp://m.tkk7.com/hengheng123456789/articles/66375.html#Feedback0http://m.tkk7.com/hengheng123456789/comments/commentRss/66375.htmlhttp://m.tkk7.com/hengheng123456789/services/trackbacks/66375.html一、前a
 
  动态MBean是在q行期才定义它的属性和Ҏ(gu)Q也是说它有什么属性和Ҏ(gu)是可以动态改变的。动态MBean主要利用一些辅助类Q构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfoQ来完成q个功能Q所有的动态MBean必须实现DynamicMBean接口。DynamicMBean写好后,使用Ҏ(gu)和第一文章中普通的MBean一栗?br /> 
  l出一个动态MBean的实例,q个实例最初动态构?jin)一个Name属性及(qing)一个printҎ(gu)Q当我们执行它的printҎ(gu)之后Q又l此MBean新增?jin)一个print1Ҏ(gu)。实例的代码如下Q?br />二、实?br />1、HelloDynamicc?br />
import java.lang.reflect.Constructor;
import java.util.Iterator;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.DynamicMBean;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.ReflectionException;

/**
 * @author Sunny Peng
 * @author change by Chen.Gang, add a feature for dynamic add operation
 * @version 1.0
 */
public class HelloDynamic implements DynamicMBean {
    //q是我们的属性名U?br />    private String name;
    private MBeanInfo mBeanInfo = null;
    private String className;
    private String description;
    private MBeanAttributeInfo[] attributes;
    private MBeanConstructorInfo[] constructors;
    private MBeanOperationInfo[] operations;
    MBeanNotificationInfo[] mBeanNotificationInfoArray;

    public HelloDynamic() {
        init();
        buildDynamicMBean();
    }

    private void init() {
        className = this.getClass().getName();
        description = "Simple implementation of a dynamic MBean.";
        attributes = new MBeanAttributeInfo[1];
        constructors = new MBeanConstructorInfo[1];
        operations = new MBeanOperationInfo[1];
        mBeanNotificationInfoArray = new MBeanNotificationInfo[0];
    }

    private void buildDynamicMBean() {
        //讑֮构造函?br />        Constructor[] thisconstructors = this.getClass().getConstructors();
        constructors[0] = new MBeanConstructorInfo("HelloDynamic(): Constructs a HelloDynamic object", thisconstructors[0]);
        //讑֮一个属?br />        attributes[0] = new MBeanAttributeInfo("Name", "java.lang.String", "Name: name string.", true, true, false);
        //operate method 我们的操作方法是print
        MBeanParameterInfo[] params = null;//无参?br />        operations[0] = new MBeanOperationInfo("print", "print(): print the name", params, "void", MBeanOperationInfo.INFO);
        mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
    }

    //动态增加一个print1Ҏ(gu)
    private void dynamicAddOperation() {
        init();
        operations = new MBeanOperationInfo[2];//讑֮数组Z?br />        buildDynamicMBean();
        operations[1] = new MBeanOperationInfo("print1", "print1(): print the name", null, "void", MBeanOperationInfo.INFO);
        mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
    }

    public Object getAttribute(String attribute_name) {
        if (attribute_name != null)
            return null;
        if (attribute_name.equals("Name"))
            return name;
        return null;
    }

    public void setAttribute(Attribute attribute) {
        if (attribute == null)
            return;
        String Name = attribute.getName();
        Object value = attribute.getValue();
        try {
            if (Name.equals("Name")) {
                // if null value, try and see if the setter returns any exception
                if (value == null) {
                    name = null;
                    // if non null value, make sure it is assignable to the attribute
                } else if ((Class.forName("java.lang.String")).isAssignableFrom(value.getClass())) {
                    name = (String) value;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public AttributeList getAttributes(String[] attributeNames) {
        if (attributeNames == null)
            return null;
        AttributeList resultList = new AttributeList();
        // if attributeNames is empty, return an empty result list
        if (attributeNames.length == 0)
            return resultList;
        for (int i = 0; i < attributeNames.length; i++) {
            try {
                Object value = getAttribute(attributeNames[i]);
                resultList.add(new Attribute(attributeNames[i], value));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return resultList;
    }

    public AttributeList setAttributes(AttributeList attributes) {
        if (attributes == null)
            return null;
        AttributeList resultList = new AttributeList();
        // if attributeNames is empty, nothing more to do
        if (attributes.isEmpty())
            return resultList;
        // for each attribute, try to set it and add to the result list if successfull
        for (Iterator i = attributes.iterator(); i.hasNext();) {
            Attribute attr = (Attribute) i.next();
            try {
                setAttribute(attr);
                String name = attr.getName();
                Object value = getAttribute(name);
                resultList.add(new Attribute(name, value));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return resultList;
    }

    public Object invoke(String operationName, Object params[], String signature[]) throws MBeanException, ReflectionException {
        // Check for a recognized operation name and call the corresponding operation
        if (operationName.equals("print")) {
            //具体实现我们的操作方法print
            System.out.println("Hello, " + name + ", this is HellDynamic!");
            dynamicAddOperation();
            return null;
        } else if (operationName.equals("print1")) {
            System.out.println("q是动态增加的一Ҏ(gu)print1");
            return null;
        } else {
            // unrecognized operation name:
            throw new ReflectionException(new NoSuchMethodException(operationName), "Cannot find the operation " + operationName + " in " + className);
        }

    }

    public MBeanInfo getMBeanInfo() {
        return mBeanInfo;
    }
}

 
说明Q?br />
    * 实现于接口DynamicMBean
    * 借助于各U辅助类完成一个类的构造。构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfo
    * q里所有publicҎ(gu)是实CDynamicMBean的。主要提供:(x)setAttribute讄属性?getAttribute取得属性、setAttributes讄一l属性、getAttributes取得一l属性、invokeҎ(gu)调用?getMBeanInfo MBeanServerp个方法得到关键的MBeancȝ构造信息?br />
2、HelloAgentc?br />  
  前面说了(jin)HelloDynamic和普通MBean的用方法是一L(fng)Q因此HelloAgent和第一的HelloAgent基本一P是把HelloҎ(gu)HelloDynamic而已。ؓ(f)?jin)实例完_(d)也一q帖出来吧?br />
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import com.sun.jdmk.comm.HtmlAdaptorServer;
public class HelloAgent {
    public static void main(String[] args) throws Exception {
        MBeanServer server = MBeanServerFactory.createMBeanServer();
        ObjectName helloName = new ObjectName("chengang:name=HelloDynamic");
        HelloDynamic hello = new HelloDynamic();
        server.registerMBean(hello, helloName);
        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
        HtmlAdaptorServer adapter = new HtmlAdaptorServer();
        server.registerMBean(adapter, adapterName);
        adapter.start();
        System.out.println("start.....");
    }
}

 
3、运?br /> 
  先运行HelloAgent。再打开览器,输入|址Qhttp://localhost:8082/。单击进入“name=HelloDynamic ”项Q执行printҎ(gu)后再回到上一面你会(x)发现又多?jin)一个print1Ҏ(gu)?br /> 
4、ȝ
  动态MBean的代码稍昑֤杂,但对于一些特D需求的情况Q它?yu)显C出强大威力。而且它还是模型MBeansQModel MBeansQ的基础。不q在一般的目中,动态MBeanq是用得比较?yu),所谓利器深藏之而不用,非常时方现光芒?/font>

哼哼 2006-08-29 11:07 发表评论
]]>
3、Notification的?/title><link>http://m.tkk7.com/hengheng123456789/articles/66095.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Mon, 28 Aug 2006 01:30:00 GMT</pubDate><guid>http://m.tkk7.com/hengheng123456789/articles/66095.html</guid><wfw:comment>http://m.tkk7.com/hengheng123456789/comments/66095.html</wfw:comment><comments>http://m.tkk7.com/hengheng123456789/articles/66095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/hengheng123456789/comments/commentRss/66095.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/hengheng123456789/services/trackbacks/66095.html</trackback:ping><description><![CDATA[ <font size="2">一、简?br /> <br />  Mbean之间的通信是必不可的QNotificationpvC(jin)在Mbean之间沟通桥梁的作用。JMX notification 由四部分l成Q?br /><br />    * Notification q个相当于一个信息包Q封装了(jin)需要传递的信息<br />    * Notification broadcaster q相当于一个广播器Q把消息q播出去<br />    * Notification listerner q是一个监听器Q用于监听广播出来的Notification消息<br />    * Notification filter q是一个过滤器Q过滤掉不需要的Notification消息<br /><br />  Notification broadcaster不需要我们实玎ͼJMX的内部已l有?jin)。Notification filter一般也很少用。下面的例子主要用到?jin)Notification、Notification listerner?br /><br />二、实?br /> <br />  在第一的Hello中有一个printHello(String whoName)Ҏ(gu)Q意思根据碰到的是谁来打招呼Q比如:(x)<br />  <br />  Jack从对面走q来Q说Q“hi?br />  我们回之以礼Q说Q“Hello, jack?br /> <br />  首先q需要Jack先说一个hiQ相应一个操作方法)(j)Q然后他说的话封装成声LQ相当Notification消息包)(j)传递出厅R然后我们还要给Jakc装上一个监听器QHello的xQ?^_^Q,q个监听器将捕捉到Jack的声波语韛_Qƈq行相应处理Q即说“Hello, jack”?br /> <br />  好,我们看看如何实现的:(x)<br /> <br />1、Jackcd(qing)其相应的MBean<br /> <br />   我们把Jack写成一个MBeanQ如下:(x) <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",//l这个Notification起个名称<br />                this, //p发出的Notification<br />                ++seq,//一pd通知中的序列?可以设Q意数?br />                System.currentTimeMillis(),//发出旉<br />                "Jack");//发出的消息文?br />        //发出?br />        sendNotification(n);<br />    }<br />}<br /><br /> <br /> 说明Q?br /><br />    * 必需l承NotificationBroadcasterSupport<br />    * 此类只有一个hiҎ(gu)Q方法只有两句:(x)创徏一个Notification消息包,然后包发出?br />    * 如果你还要在消息包上附加其他数据QNotificationq有一个setUserDataҎ(gu)可供使用<br /><br />2、接下来是他的MBean <br /><br />public interface JackMBean {<br />    public void hi();<br />}<br /><br /> <br />3、创Z个ListenerQ监听到的Notification消息包将由此c负责处理?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如下Q加上了(jin)U色的三句)(j)Q?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、先q行HelloAgent启动服务Q再打开览器输入网址Qhttp://localhost:8082/<br /> <br />2、 q入“name=jack”项Q然后单几Zhi”按钮来执行它。这时Eclipse的console视图<br />四、ȝ<br /><br />  Notification和Java的事件模型是一L(fng)Q另外如果你C(jin)《Eclipse从入门到_N》,你会(x)发现W?2.4节也使用?jin)和Notification和Java的事件模型相同的设计方式。Notification在我们的实际目中也用到?jin),象我们现在的l移动做的项目中Q基于JMX实现)Q分散在各地方的工作站的日志Q就是通过Notification方式Q把每条产生的日志封装在 Notification中实时发回主控服务器的。有Z(x)我会(x)发这一pȝ的关于日志的设计Ҏ(gu)写一下,它实C(jin)对各地工作站的集中的、实时的监控Q非常实用?/font> <img src ="http://m.tkk7.com/hengheng123456789/aggbug/66095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/hengheng123456789/" target="_blank">哼哼</a> 2006-08-28 09:30 <a href="http://m.tkk7.com/hengheng123456789/articles/66095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2、JMX?/title><link>http://m.tkk7.com/hengheng123456789/articles/66093.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Mon, 28 Aug 2006 01:28:00 GMT</pubDate><guid>http://m.tkk7.com/hengheng123456789/articles/66093.html</guid><wfw:comment>http://m.tkk7.com/hengheng123456789/comments/66093.html</wfw:comment><comments>http://m.tkk7.com/hengheng123456789/articles/66093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/hengheng123456789/comments/commentRss/66093.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/hengheng123456789/services/trackbacks/66093.html</trackback:ping><description><![CDATA[ <p> <font size="2">一、JMX?/font> </p> <p> <font size="2">  JMX是一UJAVA的正式规范,它主要目的是让程序且有被理的功能,那么怎么理解所谓的“被理”呢Q试想你开发了(jin)一个YӞ如DQ|? 站)(j)Q它是在Q4时不简断运行的Q那么你可能?x)想要“监控”这个Y件的q行情况Q比如收C(jin)多少数据Q有多少人登录等{。或者你又想“配|”这个YӞ 比如现在讉K人数比较多,你想把数据连接池讄得大一些?/font> </p> <p> <font size="2">  当然Q你也许?x)专门?f)q些理来开发YӞ但如果你借助JMXQ则?x)发现创L(fng)理E序是如此简单。因Z无需为管理程序来开发界面,已经 有通用的JMX理软gQ如MC4JQ或者是用一般都附带提供的HTML|页来管理,你要做的仅仅是将自己要被理和监控类的按照JMX规范修改一下即 可?/font> </p> <p> <font size="2">  中间件Y件WebLogic的管理页面就是基于JMX开发的Q而JBoss则整个系l都ZJMX构架。下面将JMX的一些概念,从JMX规范转帖如下Q?/font> </p> <p> <font size="2">二、JMX构架中的各层?qing)相关的lg</font> </p> <ol> <li> <font size="2">工具层(Instrumentation LevelQ?br />    (a) MBeansQ标准的Q动态的Q开攄和模型MBeansQ?br />    (b) 通知模型QNotification、NotificationListener{类<br />    (c) MBean元数据类QAttribute、Opreator{类 </font> </li> <li> <font size="2">代理层(Agent LevelQ?br />    (a) MBean Server<br />    (b) 代理服务。如前一的HtmlAdaptorServer{?/font> </li> </ol> <p> <font size="2">  MBean中有getter和setter的就是属性,如前一的HellocMName。如果只有getter则表C属性只诅R一共有四种MBeanQ如下:(x)</font> </p> <ol> <li> <font size="2">标准MBeansQStandard MBeansQ设计和实现是最单的Q这cMBean使用自己的方法名作ؓ(f)理接口Q? </font> </li> <li> <font size="2">动态MBeansQDynamic MBeansQ必dC个指定的接口Q由于动态MBeans在运行期间暴露它们的理接口Q因此更为灵z; </font> </li> <li> <font size="2">开放MBeansQOpen MBeansQ属于动态MBeansQ这cMBean依靠基础数据cd来实现通用理Qƈ为友情用戯行自我声明; </font> </li> <li> <font size="2">模型MBeansQModel MBeansQ同样也是动态MBeansQ这cMBeans是完全可配置的,在运行期间进行自我声明;它们源动态工h供一个一般性的Q有默认行ؓ(f)的MBeanscR?/font> </li> </ol> <div> <font size="2">  在前一中的Hello、HelloMBean是一个标准MBeansQStandard MBeansQ。后面接下来的几,我们?x)l介l其他几UMBean?/font> </div> <img src ="http://m.tkk7.com/hengheng123456789/aggbug/66093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/hengheng123456789/" target="_blank">哼哼</a> 2006-08-28 09:28 <a href="http://m.tkk7.com/hengheng123456789/articles/66093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1、JMX的Hello Worldhttp://m.tkk7.com/hengheng123456789/articles/65690.html哼哼哼哼Fri, 25 Aug 2006 02:00:00 GMThttp://m.tkk7.com/hengheng123456789/articles/65690.htmlhttp://m.tkk7.com/hengheng123456789/comments/65690.htmlhttp://m.tkk7.com/hengheng123456789/articles/65690.html#Feedback0http://m.tkk7.com/hengheng123456789/comments/commentRss/65690.htmlhttp://m.tkk7.com/hengheng123456789/services/trackbacks/65690.html 一、JMX?br />
  什么是JMXQ在一网文中是这栯的:(x)"JMX(Java Management Extensions)是一个ؓ(f)应用E序植入理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在Q何Java应用E序中用这些代理和服务实现理"Q这句话我现在看着q是不知所云,云里N?br />
  我们q是从JMX能给我们提供什么好处入手来理解吧。D一个应用实例:(x)在一个系l中常常?x)有一些配|信息,比如服务的IP地址Q端口号什么的Q那么如何来写这些代码呢Q?br />
   1. E序初哥一般是写死在程序里Q到要改变时去改程序,然后再编译发布;
   2. E序熟手则一般把q些信息写在一个配|文仉QJAVA一般都?.properties文gQ,到要改变时只要改配置文gQ但q是重新启动pȝQ以便读取配|文仉的新|
   3. E序好手则会(x)写一个段代码Q把配置值缓存v来,pȝ在读值的时候,先看看配|文件有没有更动。如有更改则重读一遍,否则从缓存里d?br />   4. E序高手则懂得取物ؓ(f)我所用,用JMXQ把配置属性集中在一个类Q然后写一个叫MBean的东东,再配|一下就L搞定?jin)。而且JMX自动提供?jin)一个WEB面来给你来改变q些配置信息?br />
二、准备工?br />

  JMX是一份规范,SUN依据q个规范在JDKQ?.3?.4?.0Q提供了(jin)JMX接口。而根据这个接口的实现则有很多U,比如Weblogic的JMX实现、MX4J、JBoss的JMX实现。在SUN自己也实C(jin)一份,不过在JDK1.4之前Q这件JMX实现Q一些JAR包)(j)是可选的Q你得去它的|站上下载。JDK5.0则内嵌了(jin)q来Q安装JDK5.0可以开发基于JMX的代码了(jin)?br />  但JDK5.0q包含所有SUN的关于JMX的代码,有一些工L(fng)是排除在JDK5.0之外的。下面根据所使用的JDK版本情况Q谈一谈开发环境的准备?br />1、JDK1.3?.4
  去SUN|站下蝲SUN的JMX实现Q共两个ZIP文gQ下载网址Qhttp://java.sun.com/products/JavaManagement/download.html?br />Q?Qjmx-1_2_1-ri.zip
   解压后的lib目录包含Qjmxri.jar、jmxtools.jar
Q?Qjmx_remote-1_0_1_03-ri.zip
   解压后的lib目录包含Qjmxremote.jar、jmxremote_optional.jar、rmissl.jar
  如果在DOS下用命o(h)行开发,则把q五个JAR包加入到classpathpȝ变量中。如果你用Eclipse开发,则把JAR包加入到目属性的LibratriesQ库Q引用中?br />2、JDK5.0
  JDK5.0的jre\lib\rt.jar已经包含?jin)jmxri.jar、jmxremote.jar、rmissl.jar三个包的代码。如果你用到jmxtools.jar、jmxremote_optional.jar的类Q则需要将q两个类加入到classpath?Eclipse的项目库引用中?br />3、我使用的开发环境:(x)JDK5.0 Q?Eclipse3.2?br />  注:(x)因ؓ(f)用到jmxtools.jar中的HtmlAdaptorServerc,所以将此包加入到项目库引用中。jmxremote_optional.jar暂时不用刎ͼ不管它?br />
三、HelloWorld实例
1、Hello是一个需要被理的类Q普通类Q?br />

/**
 * @author ChenGang 2005-12-3
 */
public class Hello implements HelloMBean {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void printHello() {
        System.out.println("Hello World, " + name);
    }
    public void printHello(String whoName) {
        System.out.println("Hello , " + whoName);
    }
}                                


2、要理Hello则必dZ个相应MBeanQ如下:(x)


/**
 * @author ChenGang 2005-12-3
 */
public interface HelloMBean {
    public String getName();
    public void setName(String name);
    public void printHello();
    public void printHello(String whoName);
}

                            

说明Q包含在MBean中方法都是可以被管理的。MBean起名是有规范的,是原类名后加上MBean字样?br /> 
3、创Z个Agentc?br />


import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import com.sun.jdmk.comm.HtmlAdaptorServer;

public class HelloAgent {

    public static void main(String[] args) throws Exception {
        MBeanServer server = MBeanServerFactory.createMBeanServer();

        ObjectName helloName = new ObjectName("chengang:name=HelloWorld");
        server.registerMBean(new Hello(), helloName);

        ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
        HtmlAdaptorServer adapter = new HtmlAdaptorServer();
        server.registerMBean(adapter, adapterName);

        adapter.start();
        System.out.println("start.....");

    }
}


说明Q?br />
    * 先创Z(jin)一个MBeanServerQ用来做MBean的容?br />    * Helloq个cL入到MBeanServer中,注入需要创Z个ObjectNamec?br />    * 创徏一个AdaptorServerQ这个类决定MBean的管理界面,q里用最普通的Html型界面。AdaptorServer其实也是一个MBean?br />    * chengang:name=HelloWorld的名字是有一定规则的Q格式ؓ(f)Q“域?name=MBean名称”,域名和MBean名称都可以Q意取?br />
4、运行HelloAgentQ然后打开|页Qhttp://localhost:8082/
    单击“name=HelloWorld”链接进?br />   

五、ȝ

  在实际系l中我们可以把name变成军_数库链接池的变量Q这h可以对pȝ的运行参数进行实现的监控和配|(理Q。而且也可以对一些方法(如printHelloQ进行远E调用了(jin)?br />


哼哼 2006-08-25 10:00 发表评论
]]>
վ֩ģ壺 ҹƷһ߲ŷ| ͽXXXX| vaĻþò| ƵС˵ͼƬ| ŮƷþþþ| þþžAVѾƷ| պëƬ| avۺavһ| avר | ѾƷƵ| Ƶ߹ۿ | AV뾫Ʒ| aһƬ| avëƬһ| ޻ƻƻվ߹ۿ| ޹Ʒ˾þõӰ| Ʒһѹۿ| þþƷһ| ˾þۺ| ޳츾߳XXXXX| ձ岻aվ| AVҹҹþ| 91޹˾þþƷվ| ؼëƬѲ| 91Ƶ91| AVպAV߳ר| Ƶһ| ѴƬ߹ۿ | ߳ٸëˮˮ| AVAV˵ | Ļ߿| ҹҹ۲ӰԺ| avƬ߹ۿ| ߹ۿAVƬ| ޵һƵ| wwwƵ߹ۿ| Ʒv߹ۿ | 鶹VAѾƷ | ޹ۺϾƷ| AVѹۿ| þþþAVվ|