??xml version="1.0" encoding="utf-8" standalone="yes"?>久久99久久精品欧美,国产精品一区二区三区免费观看,欧美国产综合视频http://www.aygfsteel.com/chengang/category/8015.html    逝者如斯乎不舍昼夜zh-cnWed, 28 Feb 2007 02:51:52 GMTWed, 28 Feb 2007 02:51:52 GMT60[JMX一步步来] 9、基于JBoss来写MBeanhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34091.html陈刚陈刚Tue, 07 Mar 2006 07:19:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/03/07/34091.htmlhttp://www.aygfsteel.com/chengang/comments/34091.htmlhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34091.html#Feedback1http://www.aygfsteel.com/chengang/comments/commentRss/34091.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/34091.html ?陈刚  from www.chengang.com.cn at 2005-12-26
 
  前面都是用JDK自带的JMX实现来写的MBeanQJMX的实C独SUN一ӞJBOSS也有自己的JMX实现。如果你使用JBOSS来做WEB服务器,那么ZJBOSS的实现来写MBeanQ是一个不错的选择。象我们公司是用JBOSS的,因此所有MBean都是ZJBoss来写的。基于JBoss的MBean和基于SUN的MBean有什么不同吗Q有一些不同之外,但绝大部份都一栗?/DIV>
 
  下面是我最早发的一关于JMX的文章,是我对公司所做项目的W记Q它上面的JMX例子是ZJBOSS的。博客搬?jin)几ơ家Q文章删的删丢的丢,但这文章还?sh)留着Q简单修改一下,再帖上吧?/DIV>

一?nbsp; HelloWorld实例

1、准备工?/FONT>

  JBOSS实现?/SPAN>JMX规范Q这个实例是ZJBOSS来实现的。请先去下蝲一?/SPAN>JBOSSQ我?/SPAN>jboss-3.2.6Q下载地址Q?/SPAN>http://www.jboss.com/downloads/index#as。这个实例需?/SPAN>JBOSS的两?/SPAN>JAR包的支持Q?/SPAN>jboss-system-3.2.6.jar?/SPAN>jboss-jmx-3.2.6.jarQ如果你和我一L(fng)Eclipse来开发(推荐Q,那么把这个两个包加入到项目的库引用中Q加入到库引用的Ҏ(gu)参考前面两章)(j)?/SPAN>

2、程序代?/FONT>

  假设我们有一个叫message的属性要需要经常进行改动配|的Q那么我们就把它写成一?/SPAN>MBean?/SPAN>

1?/SPAN>HelloWorldServiceMBean接口

  在写MBean之前Q我们先需要写一?/SPAN>MBean接口Q接口里的方法都是属性的set/getҎ(gu)。这个接口必ȝ承接?/SPAN>ServiceMBean?/SPAN>


import org.jboss.system.ServiceMBean;
public interface HelloWorldServiceMBean extends ServiceMBean {
    String getMessage();
    void setMessage(String message);
}

2?/SPAN>HelloWorldService实现c?/SPAN>

  然后写出HelloWorldServiceMBean接口的实现类HelloWorldServiceQ这个实现类q必ȝ?/SPAN>ServiceMBeanSupportcR?/SPAN>q种cd单不q了(jin)Q就是属性和相应?/SPAN>set/getҎ(gu)Q?/SPAN>EJB中叫实体cR?/SPAN>Hibernate中叫POJO?/SPAN>

import org.jboss.system.ServiceMBeanSupport;
public class HelloWorldService extends ServiceMBeanSupport implements HelloWorldServiceMBean {
    private String message;
    public String getMessage() {
        System.out.println("getMessage()=" + message);
        return message;
    }

    public void setMessage(String message) {
        System.out.println("setMessage(" + message + ")");
        this.message = message;
    }
}

3、配|文?/SPAN>jboss-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<server>
    <mbean code="example.mbean.HelloWorldService" name="www.chengang.com.cn:service=HelloWorld">
        <attribute name="Message">Hello World</attribute>
    </mbean>
</server>

说明Q?/FONT>

l codeҎ(gu)?/SPAN>MBean的实现类HelloWorldService
l nameҎ(gu)一个名Uͼ格式一般是Q?/SPAN>[说明性文?/SPAN>]:service=[cd]
l attribute是ؓ(f)属性设|初始|q样?/SPAN>JBOSS一加蝲HelloWorldServicecLQ?/SPAN>message属性就有了(jin)一个初始?/SPAN>Hello World。注?/SPAN>Message的第一个字母必L大写?/SPAN>

二、将实例部v到JBOSS

  ?/SPAN>jboss-3.2.6\server\default\deploy目录下创Z?/SPAN>hello.sar目录Q然后创建如下目录文件结构:(x)

hello.sar
|----example
|            |----mbean
|                    |----HelloWorldService.class  (注意Q是*.classQ不?/SPAN>*.java)
|                    |----HelloWorldServiceMBean.class
|----META-INF
             |----jboss-service.xml

其他说明Q?/FONT>

l 也可以将hello.sar目录?/SPAN>zip格式压羃成一个同名的hello.sar文gQ放?/SPAN>jboss-3.2.6\server\default\deploy目录下?BR>l JBOSS支持热部|Ԍ也就是说你在布置q个目录时ƈ不需要重?/SPAN>JBOSS?/SPAN>

三、MBean的效?/FONT>

打开|址Q?/SPAN>http://127.0.0.1:8080/jmx-console/ Q出C?/SPAN>

1135588829669_6124.jpg然后单击?/SPAN>service=HelloWorld”项打开详细面如下Q?/SPAN>

1135588871713_5327.jpg

?/SPAN>HelloWorld”改成?/SPAN>Hello WorldQ?/SPAN>ChenGang”,再单几Z?/SPAN>Apply Changes”应用修改,得到如下效果Q?/SPAN>

1135588893639_3324.jpg

四?/SPAN>其他cd何?/SPAN>Messag属?/SPAN>

  现在我们可以通过一个自动提供的WEB面来设|?/SPAN>Message属性了(jin)Q接下来的问题是Q“在其他cM应该如何得到Message的属性值”?/SPAN>MBean?/SPAN>JBoss是只保留一?/SPAN>MBean的实例(单例模式Q)(j)Q也是说问题{成我们如何去取得q个唯一实例。例E如下:(x)

1、创Z个用到Message属性的c?/SPAN>

import org.jboss.mx.util.MBeanProxyExt;
import org.jboss.mx.util.ObjectNameFactory;
public class Client {
    public void go() {
        HelloWorldServiceMBean mbean = (HelloWorldServiceMBean) MBeanProxyExt.create(HelloWorldServiceMBean.class, ObjectNameFactory.create(www.chengang.com.cn:service=HelloWorld));
        String msg = mbean.getMessage();
        System.out.println("Client.go()=" + msg);
    }
} 

注意Q?/SPAN>goҎ(gu)里是三句。第一句比较长Q它是根?/SPAN>jboss-service.xml文g中设|的MBean名称Q来取得?/SPAN>MBean?/SPAN>JBOSS中的实例?/SPAN>

2、在Mbean中加一个相应的调用Client.go的方?/SPAN>

 ?/SPAN>HelloWorldServiceMBean接口中加入一句:(x)

void callGo();

?/SPAN>HelloWorldServicecM加入现实Ҏ(gu)Q?/SPAN>

    public void callGo() {
        new Client().go();
    }

3、更新布|?/SPAN>

   三个类?/SPAN>class文gQ?/SPAN>Clien.class?/SPAN>HelloWorldServiceMBean.class?/SPAN>HelloWorldService.classQ更新到JBOSS?/SPAN>hello.sar\example\mbean目录下。然后重?/SPAN>JBOSS?/SPAN>

4、查看效?/SPAN>

   打开JBOSS提供?/SPAN>MBean讄面Q如下,发现多了(jin)一?/SPAN>callGo?/SPAN>

1135589421532_8527.jpg

单击callGo后?/SPAN>invoke按钮Q得到如下的DOS输出Q?/SPAN>

1135589435968_2575.jpg

五?/SPAN>

l 本实例仅演示?jin)一?/SPAN>Message属性,你当然可以在HelloWorldService中加入更多属性,别忘?sh)(jin)?/SPAN>HelloWorldServiceMBean接口也加入相应的set/getҎ(gu)?BR>l 本实例的message属性是Stringcd的,?/SPAN>JMX也支持其他的cdQ甚x(chng)XML信息。对?/SPAN>jboss-service.xml中的XML信息Q这时属性类型要求是org.w3c.dom.ElementQ?/SPAN>JMX它?yu)装成?jin)一?/SPAN>XML?/SPAN>DOM对象?BR>l 回顾一下,JMX也是配|信息写在了(jin)一个文Ӟjboss-service.xml文gQ里嘛,相对于将配置文g写到*.properties文g的方式,它似乎也没什么新鲜的地方。但通过本章实例我们可以看到JMX的一些好处:(x)我们不用写代码去读配|文件的信息Q而且JMX支持的属性类型是多种多样的(如上面说?/SPAN>org.w3c.dom.ElementQ。更重要的是JMXq提供了(jin)一整套的属性之前互相访问、互相调用的功能Q这?/SPAN>HelloWorld实例所反映的只是冰׃角而已?/SPAN>

六、参考资料:(x)http://www.huihoo.com/java/jmx/jmx_base.html 

七、作者简?/FONT>

陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>(zhn)可以通过其博客了(jin)解更多信息和文章Q?A >http://www.chenGang.com.cn



陈刚 2006-03-07 15:19 发表评论
]]>[JMX一步步来] 8、编写程序来q接MBeanhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34089.html陈刚陈刚Tue, 07 Mar 2006 07:17:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/03/07/34089.htmlhttp://www.aygfsteel.com/chengang/comments/34089.htmlhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34089.html#Feedback1http://www.aygfsteel.com/chengang/comments/commentRss/34089.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/34089.html?陈刚  from www.chengang.com.cn at 2005-12-26
 
  前面用Html、jconsole{方法连接上?jin)MBeanServerQƈ能够通过q些界面来操UMBean。但有时我们需要不借助q些客户端,而是在自qE序来操U这些MBeanQ这p求我们知道如何在代码里连接MBean?/DIV>
 
  Z上一ؓ(f)jconsole而修改的例子Q给Z个示例的客户端程序,基本的操作都有了(jin)Q?/DIV>

import java.util.Iterator;
import java.util.Set;
import javax.management.Attribute;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class Client {
    public static void main(String[] args) throws Exception {
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
        JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
        ObjectName mbeanName = new ObjectName("chengang:name=HelloWorld");
        //把所有Domain都打印出?BR>        System.out.println("Domains:---------------");
        String domains[] = mbsc.getDomains();
        for (int i = 0; i < domains.length; i++) {
            System.out.println("\tDomain[" + i + "] = " + domains[i]);
        }
        //MBean的L
        System.out.println("MBean count = " + mbsc.getMBeanCount());
        //对name属性的操作Q属性名的第一个字母要大写Q?BR>        mbsc.setAttribute(mbeanName, new Attribute("Name", "Chen.Gang"));//讑ր?BR>        System.out.println("Name = " + mbsc.getAttribute(mbeanName, "Name"));//取?/PRE>
        //得到proxy代理后直接调用的方式
        HelloMBean proxy = (HelloMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, mbeanName, HelloMBean.class, false);
        proxy.printHello();
        proxy.printHello("陈刚");
        //q程调用的方?BR>        mbsc.invoke(mbeanName, "printHello", null, null);
        mbsc.invoke(mbeanName, "printHello", new Object[] { "子在川上? }, new String[] { String.class.getName() });
        //得mbean的信?BR>        MBeanInfo info = mbsc.getMBeanInfo(mbeanName);
        System.out.println("Hello Class: " + info.getClassName());
        System.out.println("Hello AttriberQ? + info.getAttributes()[0].getName());
        System.out.println("Hello OperationQ? + info.getOperations()[0].getName());
        //得到所有的MBean的ObjectName
        System.out.println("all ObjectNameQ?--------------");
        Set set = mbsc.queryMBeans(null, null);
        for (Iterator it = set.iterator(); it.hasNext();) {
            ObjectInstance oi = (ObjectInstance) it.next();
            System.out.println("\t" + oi.getObjectName());
        }
        //注销
        //mbsc.unregisterMBean(mbeanName);
        //关闭MBeanServerq接
        jmxc.close();
    }
}
 
q行后的效果如下Q?/DIV>
Domains:---------------
 Domain[0] = HelloAgent
 Domain[1] = JMImplementation
 Domain[2] = chengang
MBean count = 3
Name = Chen.Gang
Hello Class: mbean.connector.Hello
Hello AttriberQName
Hello OperationQprintHello
all ObjectNameQ?--------------
 chengang:name=HelloWorld
 JMImplementation:type=MBeanServerDelegate
 HelloAgent:name=htmladapter,port=8082
 
 
它有两个Console输出Q这里是另一?/STRONG>
Hello World, Chen.Gang
Hello , 陈刚
Hello World, Chen.Gang
Hello , 子在川上?BR> 

作者简?/STRONG>

陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>(zhn)可以通过其博客了(jin)解更多信息和文章Q?A >http://www.chenGang.com.cn



陈刚 2006-03-07 15:17 发表评论
]]>[JMX一步步来] 7、用JDK5.0的JConsole来连接MBeanhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34088.html陈刚陈刚Tue, 07 Mar 2006 07:08:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/03/07/34088.htmlhttp://www.aygfsteel.com/chengang/comments/34088.htmlhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34088.html#Feedback0http://www.aygfsteel.com/chengang/comments/commentRss/34088.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/34088.html?陈刚  from www.chengang.com.cn at 2005-12-26
 
  前面所有看效果都是通过Html|页来看的。JDK5.0自带?jin)一个jmx客户端,叫jconsoleQ位于c:\jdk\bin\jconsole.exe。我们来用用q个客户端来q接Mbean Server?/DIV>
 
一、vm参数方式
 
1、还是用W一的那个HelloAgentQ修改HelloAgentQ将W一句:(x)
MBeanServer server = MBeanServerFactory.createMBeanServer();
改ؓ(f)Q?STRONG>MBeanServer server = ManagementFactory.getPlatformMBeanServer();
注:(x)ManagementFactory的全路径为:(x)java.lang.management.ManagementFactory
 
2、修改Eclipse的run选项Q把?STRONG>-Dcom.sun.management.jmxremote=HelloAgent”这一句加入到run选项中,修改如下图:(x)
1135579391260_7463.gif
 
3、运行HelloAgentQ然后在DosH口输入“jconsole”来启到JConsoleQ得到如下界面?IMG style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt=1135579573812_8685.gif src="http://blog.sohu.com/images/person/2005/12/26/1135579573812_8685.gif" border=0> 
4、单几Z连接”,q入以下界面Q?/DIV>
1135579720638_3644.gif
 
二、RMI方式
 
  q是用jconsoleQ但方式变(sh)(jin)。这里不需要象上面那样修改Eclipse run的vm选项?/DIV>
 
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下运行命令jconsoleQ得到如下界面,输入service:jmx:rmi:///jndi/rmi://localhost:9999/server
 1135580892339_8412.gif
三、ȝ
  q接MBeanServer的方式除?jin)Html、JConsoleQ还有一些第三方的客L(fng)Q比较有名的是MC4jQ通过q些客户端我们可以很Ҏ(gu)去访问MBean。这也就是我们ؓ(f)什么要用JMX的其中一个原因:(x)试想如果我自己搞一套标准,势必要自己开发一个客L(fng)Q那?x)是一个不的工作量?/DIV>

作者简?/STRONG>

陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>(zhn)可以通过其博客了(jin)解更多信息和文章Q?A >http://www.chenGang.com.cn



陈刚 2006-03-07 15:08 发表评论
]]>[JMX一步步来] 6、模型BeanQModel Beanhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34087.html陈刚陈刚Tue, 07 Mar 2006 07:07:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/03/07/34087.htmlhttp://www.aygfsteel.com/chengang/comments/34087.htmlhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34087.html#Feedback0http://www.aygfsteel.com/chengang/comments/commentRss/34087.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/34087.html?陈刚  from www.chengang.com.cn at 2005-12-26
 
  在上一节是用apache的commons-modeler来开发的一个modelQ只不过commons-modeler帮助我们实现?jin)很多的代码Q而我们只需要写描述XML文gp?jin)。这一节,来一个实打实的Model BeanQ不借助MW三方工具包。例子还是沿用Helloq个c,以便于和以前的实现相比较?/DIV>
 
一、Model MBean实例
1、Hello.javaq是和以前的一栗这里它没有再加上一个MBean接口?jin),只是一个很普通的cR?/DIV>
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.MBeanParameterInfo;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;
import javax.management.modelmbean.ModelMBeanOperationInfo;
import javax.management.modelmbean.RequiredModelMBean;
public class ModelMBeanUtils {
    private static final boolean READABLE = true;
    private static final boolean WRITABLE = true;
    private static final boolean BOOLEAN = true;
    private static final String STRING_CLASS = "java.lang.String";
    public static RequiredModelMBean createModlerMBean() {
        RequiredModelMBean model = null;
        try {
            model = new RequiredModelMBean();
            model.setManagedResource(new Hello(), "ObjectReference");
            ModelMBeanInfo info = createModelMBeanInfo();
            model.setModelMBeanInfo(info);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return model;
    }
    private static ModelMBeanInfo createModelMBeanInfo() {
        //////////////////////////////////////////////////////////////////
        //                        属?nbsp;                                       //
        //////////////////////////////////////////////////////////////////
        // 构造name属性信?BR>        ModelMBeanAttributeInfo nameAttrInfo = new ModelMBeanAttributeInfo(//
                "Name", // 属性名       
                STRING_CLASS, //属性类?nbsp;   
                "people name", // 描述文字      
                READABLE, WRITABLE, !BOOLEAN, // d      
                null // 属性描q子
        );
        //////////////////////////////////////////////////////////////////
        //                        Ҏ(gu)                                        //
        //////////////////////////////////////////////////////////////////
        //构?printHello()操作的信?nbsp;      
        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?
                nameAttrInfo },//只有一个属?
                null, // 所有的构造函C?nbsp; 
                new ModelMBeanOperationInfo[] { // 所有的操作信息Q数l)(j)
                        print1Info,
                        print2Info },//
                null, // 所有的通知信息(本例?
                null//MBean描述?BR>        );
        return mbeanInfo;
    }
}
 
4、看效果的方法和以前一Pq行HelloAgentQ用览器打开Q?A href="http://localhost:8082/">http://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)?/DIV>
 
 l心(j)的h?x)发现动态MBean和这一节的模型Mbean非常怼Q但它们q是有很大不同的Q动态MBean没有Helloc,它要自己实现HellocM的方法逻辑?/DIV>
   

作者简?/STRONG>

陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>(zhn)可以通过其博客了(jin)解更多信息和文章Q?A >http://www.chenGang.com.cn



陈刚 2006-03-07 15:07 发表评论
]]>[JMX一步步来] 5、用Apache的commons-modeler来辅助开发JMXhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34086.html陈刚陈刚Tue, 07 Mar 2006 07:05:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/03/07/34086.htmlhttp://www.aygfsteel.com/chengang/comments/34086.htmlhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34086.html#Feedback0http://www.aygfsteel.com/chengang/comments/commentRss/34086.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/34086.html?陈刚  from www.chengang.com.cn at 2005-12-13
 
一、前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)?/DIV>
  开始实例之前,你需要先去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ơ?/DIV>
 
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的注释说明信?
  • domain mbean所属域
  • group mbean所属组
  • type mbean的类全名Q包名+cdQ?
  • 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所没有的?/DIV>
Registry registry = Registry.getRegistry(null, null);
InputStream stream = HelloAgent.class.getResourceAsStream("Mbeans-descriptors.xml");
registry.loadMetadata(stream);
stream.close();
 
Q?Q接着创徏MBeanServer的方式也不同?/DIV>
现在QMBeanServer server = registry.getMBeanServer();
以前: MBeanServer server = MBeanServerFactory.createMBeanServer();
 
Q?QHello相应的ObjectName创徏也略不相同。主要是域名在XML描述文g里设|好?jin)?/DIV>
现在QManagedBean managed = registry.findManagedBean("Hello");
     ObjectName helloName = new ObjectName(managed.getDomain() + ":name=HelloWorld");
以前QObjectName helloName = new ObjectName("chengang:name=HelloWorld")
 
Q?Q得到MBean的方式也不同Q这里就是关键的不同?/DIV>
现在QModelMBean hello = managed.createMBean(new Hello());
以前QHello hello = new Hello();
注意Qؓ(f)什么现在要比以前多一个createMbean步骤呢,是因ؓ(f)现在的写法ƈ没有写MbeanQ所以需要动态才需要生成一个。而以前就直接把new Hello()注册到mbean server可以了(jin)Qserver?x)自动找到它的HelloMBean接口文g?/DIV>
 
 也就上面四点区别Q其他代码完全一栗测试和查看效果的方法和以前一P在此不篏qC(jin)。我们来看看界面情况有那些变化(U圈部䆾Q?/DIV>
1134441073198_3333.gif
 
 由图可见commons Modeler为Hello动态生成了(jin)一个MBean接口QBaseModelBean
 
参考资?/STRONG>

作者简?/STRONG>

陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>(zhn)可以通过其博客了(jin)解更多信息和文章Q?A >http://www.chenGang.com.cn



陈刚 2006-03-07 15:05 发表评论
]]>[JMX一步步来] 4、动态MBeanQDynamicMBeanhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34084.html陈刚陈刚Tue, 07 Mar 2006 07:03:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/03/07/34084.htmlhttp://www.aygfsteel.com/chengang/comments/34084.htmlhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34084.html#Feedback0http://www.aygfsteel.com/chengang/comments/commentRss/34084.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/34084.html?陈刚  from www.chengang.com.cn at 2005-12-4
  
一、前a
 
  动态MBean是在q行期才定义它的属性和Ҏ(gu)Q也是说它有什么属性和Ҏ(gu)是可以动态改变的。动态MBean主要利用一些辅助类Q构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfoQ来完成q个功能Q所有的动态MBean必须实现DynamicMBean接口。DynamicMBean写好后,使用Ҏ(gu)和第一文章中普通的MBean一栗?/DIV>
 
  l出一个动态MBean的实例,q个实例最初动态构?jin)一个Name属性及(qing)一个printҎ(gu)Q当我们执行它的printҎ(gu)之后Q又l此MBean新增?jin)一个print1Ҏ(gu)。实例的代码如下Q?/DIV>
二、实?/STRONG>
1、HelloDynamicc?/DIV>
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?/DIV>
  • 实现于接口DynamicMBean
  • 借助于各U辅助类完成一个类的构造。构造函数类MBeanConstructorInfo、属性类MBeanAttributeInfo、方法类MBeanOperationInfo
  • q里所有publicҎ(gu)是实CDynamicMBean的。主要提供:(x)setAttribute讄属性、getAttribute取得属性、setAttributes讄一l属性、getAttributes取得一l属性、invokeҎ(gu)调用、getMBeanInfo MBeanServerp个方法得到关键的MBeancȝ构造信息?/LI>
2、HelloAgentc?/DIV>
  
  前面说了(jin)HelloDynamic和普通MBean的用方法是一L(fng)Q因此HelloAgent和第一的HelloAgent基本一P是把HelloҎ(gu)HelloDynamic而已。ؓ(f)?jin)实例完_(d)也一q帖出来吧?/DIV>
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、运?/STRONG>
 
  先运行HelloAgent。再打开览器,输入|址Q?A href="http://localhost:8082/">http://localhost:8082/。单击进入?A href="http://localhost:8082/ViewObjectRes//chengang:name=HelloDynamic">name=HelloDynamic ”项Q执行printҎ(gu)后再回到上一面你会(x)发现又多?jin)一个print1Ҏ(gu)?/DIV>
 
4、ȝ
  动态MBean的代码稍昑֤杂,但对于一些特D需求的情况Q它?yu)显C出强大威力。而且它还是模型MBeansQModel MBeansQ的基础。不q在一般的目中,动态MBeanq是用得比较?yu),所谓利器深藏之而不用,非常时方现光芒?/DIV>

作者简?/STRONG>

陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>(zhn)可以通过其博客了(jin)解更多信息和文章Q?A >http://www.chenGang.com.cn



陈刚 2006-03-07 15:03 发表评论
]]>[JMX一步步来] 3、Notification的?/title><link>http://www.aygfsteel.com/chengang/archive/2006/03/07/34083.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Tue, 07 Mar 2006 07:01:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/03/07/34083.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/34083.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/03/07/34083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/34083.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/34083.html</trackback:ping><description><![CDATA[<DIV> <DIV align=center>?陈刚 from <A >www.chengang.com.cn</A> at 2005-12-4</DIV> <DIV align=center> </DIV> <DIV align=center></DIV> <DIV></DIV> <DIV><STRONG>一、简?/STRONG></DIV> <DIV> </DIV> <DIV></DIV> <DIV>  Mbean之间的通信是必不可的QNotificationpvC(jin)在Mbean之间沟通桥梁的作用。JMX notification 由四部分l成Q?/DIV> <DIV></DIV> <UL> <LI>Notification q个相当于一个信息包Q封装了(jin)需要传递的信息 <LI>Notification broadcaster q相当于一个广播器Q把消息q播出去 <LI>Notification listerner q是一个监听器Q用于监听广播出来的Notification消息 <LI>Notification filter q是一个过滤器Q过滤掉不需要的Notification消息</LI></UL> <DIV></DIV> <DIV>  Notification broadcaster不需要我们实玎ͼJMX的内部已l有?jin)。Notification filter一般也很少用。下面的例子主要用到?jin)Notification、Notification listerner?/DIV> <DIV></DIV> <DIV><BR></DIV> <DIV><STRONG>二、实?/STRONG></DIV> <DIV> </DIV> <DIV></DIV> <DIV>  在第一的Hello中有一个printHello(String whoName)Ҏ(gu)Q意思根据碰到的是谁来打招呼Q比如:(x)</DIV> <DIV>  </DIV> <DIV>  Jack从对面走q来Q说Q“hi?/DIV> <DIV>  我们回之以礼Q说Q“Hello, jack?/DIV> <DIV> </DIV> <DIV></DIV> <DIV>  首先q需要Jack先说一个hiQ相应一个操作方法)(j)Q然后他说的话封装成声LQ相当Notification消息包)(j)传递出厅R然后我们还要给Jakc装上一个监听器QHello的x(chng)Q?^_^Q,q个监听器将捕捉到Jack的声波语韛_Qƈq行相应处理Q即说“Hello, jack”?/DIV> <DIV> </DIV> <DIV></DIV> <DIV>  好,我们看看如何实现的:(x)</DIV> <DIV> </DIV> <DIV>1、Jackcd(qing)其相应的MBean</DIV> <DIV> </DIV> <DIV>   我们把Jack写成一个MBeanQ如下:(x) </DIV> <DIV></DIV> <DIV> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>import javax.management.Notification;<BR>import javax.management.NotificationBroadcasterSupport;</PRE><PRE>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>}</PRE></DIV></DIV> <DIV> </DIV> <DIV> 说明Q?</DIV> <UL> <LI>必需l承NotificationBroadcasterSupport <LI>此类只有一个hiҎ(gu)Q方法只有两句:(x)创徏一个Notification消息包,然后包发出? <LI>如果你还要在消息包上附加其他数据QNotificationq有一个setUserDataҎ(gu)可供使用</LI></UL> <DIV></DIV> <DIV> <DIV> <DIV>2、接下来是他的MBean </DIV></DIV> <DIV> <DIV> <DIV> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>public interface JackMBean {<BR>    public void hi();<BR>}</PRE></DIV></DIV> <DIV> </DIV> <DIV>3、创Z个ListenerQ监听到的Notification消息包将由此c负责处理?/DIV></DIV> <DIV>  <DIV> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>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());</PRE><PRE>        if (handback != null) {<BR>            if (handback instanceof Hello) {<BR>                Hello hello = (Hello) handback;<BR>                hello.printHello(n.getMessage());<BR>            }<BR>        }<BR>    }<BR>}</PRE></DIV></DIV> <DIV> </DIV> <DIV> <DIV>4、修改HelloAgent如下Q加上了(jin)U色的三句)(j)Q?/DIV> <DIV></DIV> <DIV> <DIV style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: 1px solid; WIDTH: 100%; PADDING-TOP: 1px; BORDER-BOTTOM: 1px solid; HEIGHT: 18px"><PRE>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><FONT color=#ff0000>        Jack jack = new Jack();<BR>        server.registerMBean(jack, new ObjectName("HelloAgent:name=jack"));<BR>        jack.addNotificationListener(new HelloListener(), null, hello);<BR></FONT>        adapter.start();<BR>        System.out.println("start.....");<BR>    }<BR>}</PRE></DIV></DIV> <DIV> </DIV> <DIV></DIV> <DIV><STRONG>三、运?/STRONG><STRONG> </STRONG></DIV> <DIV></DIV> <DIV>1、先q行HelloAgent启动服务Q再打开览器输入网址Q?A href="http://localhost:8082/">http://localhost:8082/</A>Q出现如下界面?IMG style="DISPLAY: block" alt=1133701664014_6541.jpg src="http://blog.sohu.com/images/person/2005/12/4/1133701664014_6541.jpg" border=0></DIV> <DIV></DIV> <DIV> </DIV> <DIV>2、 q入“name=jack”项Q然后单几Zhi”按钮来执行它。这时Eclipse的console视图昄如下Q?/DIV> <DIV> </DIV> <DIV><IMG style="DISPLAY: block" alt=1133702044916_7117.jpg src="http://blog.sohu.com/images/person/2005/12/4/1133702044916_7117.jpg" border=0></DIV> <DIV></DIV> <DIV> <DIV></DIV></DIV></DIV></DIV></DIV></DIV> <DIV></DIV> <DIV></DIV> <DIV> <P><STRONG>四、ȝ</STRONG></P> <P><STRONG>  </STRONG>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非常实用?/P> <P><STRONG>作者简?/STRONG></P> <P>陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>(zhn)可以通过其博客了(jin)解更多信息和文章Q?A ><FONT color=#000033>http://www.chenGang.com.cn</FONT></A> </P></DIV></DIV><img src ="http://www.aygfsteel.com/chengang/aggbug/34083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-03-07 15:01 <a href="http://www.aygfsteel.com/chengang/archive/2006/03/07/34083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[JMX一步步来] 2、JMX?/title><link>http://www.aygfsteel.com/chengang/archive/2006/03/07/34082.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Tue, 07 Mar 2006 07:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/03/07/34082.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/34082.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/03/07/34082.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/34082.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/34082.html</trackback:ping><description><![CDATA[<DIV align=center>?陈刚 from <A >www.chengang.com.cn</A> at 2005-12-4</DIV> <DIV></DIV> <P>一、JMX?/P> <P>  JMX是一UJAVA的正式规范,它主要目的是让程序且有被理的功能,那么怎么理解所谓的“被理”呢Q试想你开发了(jin)一个YӞ如DQ|站Q,它是在2Q小时不断运行的Q那么你可能?x)想要“监控”这个Y件的q行情况Q比如收C(jin)多少数据Q有多少人登录等{。或者你又想“配|”这个YӞ比如现在讉K人数比较多,你想把数据连接池讄得大一些?/P> <P>  当然Q你也许?x)专门?f)q些理来开发YӞ但如果你借助JMXQ则?x)发现创L(fng)理E序是如此简单。因Z无需为管理程序来开发界面,已经有通用的JMX理软gQ如MC4JQ或者是用一般都附带提供的HTML|页来管理,你要做的仅仅是将自己要被理和监控类的按照JMX规范修改一下即可?/P> <P>  中间件Y件WebLogic的管理页面就是基于JMX开发的Q而JBoss则整个系l都ZJMX构架。下面将JMX的一些概念,从JMX规范转帖如下Q?/P> <P>二、JMX构架中的各层?qing)相关的lg</P> <OL> <LI>工具层(Instrumentation LevelQ?BR>    (a) MBeansQ标准的Q动态的Q开攄和模型MBeansQ?BR>    (b) 通知模型QNotification、NotificationListener{类<BR>    (c) MBean元数据类QAttribute、Opreator{类 <LI>代理层(Agent LevelQ?BR>    (a) MBean Server<BR>    (b) 代理服务。如前一的HtmlAdaptorServer{?/LI></OL> <P>以下是从|上扑ֈ的两个图Q?/P> <P>Q图1Q?IMG style="DISPLAY: block" alt=1133692832597_4252.jpg src="http://blog.sohu.com/images/person/2005/12/4/1133692832597_4252.jpg" border=0></P> <P>Q图2Q?/P> <P><IMG style="DISPLAY: block" alt=1133692869186_5136.gif src="http://blog.sohu.com/images/person/2005/12/4/1133692869186_5136.gif" border=0></P> <P></P> <P>  MBean中有getter和setter的就是属性,如前一的HellocMName。如果只有getter则表C属性只诅R一共有四种MBeanQ如下:(x)</P> <OL> <LI>标准MBeansQStandard MBeansQ设计和实现是最单的Q这cMBean使用自己的方法名作ؓ(f)理接口Q? <LI>动态MBeansQDynamic MBeansQ必dC个指定的接口Q由于动态MBeans在运行期间暴露它们的理接口Q因此更为灵z; <LI>开放MBeansQOpen MBeansQ属于动态MBeansQ这cMBean依靠基础数据cd来实现通用理Qƈ为友情用戯行自我声明; <LI>模型MBeansQModel MBeansQ同样也是动态MBeansQ这cMBeans是完全可配置的,在运行期间进行自我声明;它们源动态工h供一个一般性的Q有默认行ؓ(f)的MBeanscR?/LI></OL> <DIV>  在前一中的Hello、HelloMBean是一个标准MBeansQStandard MBeansQ。后面接下来的几,我们?x)l介l其他几UMBean?/DIV><img src ="http://www.aygfsteel.com/chengang/aggbug/34082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-03-07 15:00 <a href="http://www.aygfsteel.com/chengang/archive/2006/03/07/34082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jboss中JMX的连接与Mbean的获?/title><link>http://www.aygfsteel.com/chengang/archive/2006/03/07/34078.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Tue, 07 Mar 2006 06:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/chengang/archive/2006/03/07/34078.html</guid><wfw:comment>http://www.aygfsteel.com/chengang/comments/34078.html</wfw:comment><comments>http://www.aygfsteel.com/chengang/archive/2006/03/07/34078.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/chengang/comments/commentRss/34078.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/chengang/services/trackbacks/34078.html</trackback:ping><description><![CDATA[<DIV align=center>?陈刚 from <A ><FONT color=#222266>www.chengang.com.cn</FONT></A></DIV> <P>l出一个例E吧<BR>Q?Q它需要Jboss的jbossall-client.jar包的支持<BR>Q?Q运行环境ؓ(f)Jboss3.2.6 + jdk5.0 + eclipse3.2M2。jdk5.0内置?jin)JMX支持Q如果你不是jdk5.0的话eclipse可能?x)报有?x)cL不到的错?BR>Q?Q之前必选启动Jboss<BR></P> <DIV> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> java.util.Iterator;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> java.util.Properties;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> java.util.Set;<BR><BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> javax.management.MBeanInfo;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> javax.management.MBeanOperationInfo;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> javax.management.MBeanParameterInfo;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> javax.management.ObjectInstance;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> javax.management.ObjectName;<BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> javax.naming.InitialContext;<BR><BR></SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000"> org.jboss.jmx.adaptor.rmi.RMIAdaptor;<BR><BR></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"> TestJMX {<BR><BR>    </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> main(String[] args) </SPAN><SPAN style="COLOR: #0000ff">throws</SPAN><SPAN style="COLOR: #000000"> Exception {<BR>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Get RMIAdaptor Object</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">        Properties pro </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> Properties();<BR>        pro.setProperty(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">java.naming.factory.initial</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">, </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.jnp.interfaces.NamingContextFactory</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>        pro.setProperty(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">java.naming.provider.url</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">, </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jnp://localhost:1099</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>        pro.setProperty(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">java.naming.factory.url.pkgs</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">, </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.jboss.naming:org.jnp.interfaces</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>        InitialContext ic </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> InitialContext(pro);<BR>        RMIAdaptor server </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> (RMIAdaptor) ic.lookup(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jmx/rmi/RMIAdaptor</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><BR>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> Get the MBeanInfo for the JNDIView MBean</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">        ObjectName name </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> ObjectName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jboss:service=JNDIView</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>        MBeanInfo info </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> server.getMBeanInfo(name);<BR>        System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">JNDIView Class: </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> info.getClassName());<BR>        MBeanOperationInfo[] opInfo </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> info.getOperations();<BR>        System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">JNDIView Operations: </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>        </SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000"> (</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> o </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">; o </SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #000000"> opInfo.length; o</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">) {<BR>            MBeanOperationInfo op </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> opInfo[o];<BR>            String returnType </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> op.getReturnType();<BR>            String opName </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> op.getName();<BR>            System.out.print(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> + </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> returnType </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> opName </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>            MBeanParameterInfo[] params </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> op.getSignature();<BR>            </SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000"> (</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000"> p </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">; p </SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #000000"> params.length; p</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">) {<BR>                MBeanParameterInfo paramInfo </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> params[p];<BR>                String pname </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> paramInfo.getName();<BR>                String type </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> paramInfo.getType();<BR>                </SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000"> (pname.equals(type))<BR>                    System.out.print(type);<BR>                </SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000"><BR>                    System.out.print(type </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> name);<BR>                </SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000"> (p </SPAN><SPAN style="COLOR: #000000"><</SPAN><SPAN style="COLOR: #000000"> params.length </SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">)<BR>                    System.out.print(</SPAN><SPAN style="COLOR: #000000">&apos;</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">&apos;</SPAN><SPAN style="COLOR: #000000">);<BR>            }<BR>            System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>        }<BR><BR>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">Get all MBeans</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">        Set mbSet </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> server.queryMBeans(</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">, </SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">); </SPAN><SPAN style="COLOR: #008000">//<BR></SPAN><SPAN style="COLOR: #000000">        </SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000"> (Iterator it </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> mbSet.iterator(); it.hasNext();) {<BR>            ObjectInstance oi </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> (ObjectInstance) it.next();<BR>            System.out.println(oi.getObjectName());<BR>        }<BR>    }<BR></SPAN></DIV></DIV> <P></P> <P>q里有一D늽上找到的代码,正好是实C(jin)配置文g修改后重ȝ功能.<BR><BR>import java.io.File;<BR>import java.io.FileInputStream;<BR>import java.io.IOException;<BR>import java.net.URL;<BR>import java.util.Properties;<BR><BR>/** <BR>* @author Robbin Fan <BR>*/<BR>public class ConfigUtil {<BR><BR>private static Properties props = null;<BR>private static File configFile = null;<BR>private static long fileLastModified = 0L;<BR><BR>private static void init() {<BR>URL url = ConfigUtil.class.getClassLoader().getResource("global.properties");<BR>configFile = new File(url.getFile());<BR>fileLastModified = configFile.lastModified();<BR>props = new Properties();<BR>load();<BR>}<BR><BR>private static void load() {<BR>try {<BR>props.load(new FileInputStream(configFile));<BR>fileLastModified = configFile.lastModified();<BR>} catch (IOException e) {<BR>throw new RuntimeException(e);<BR>}<BR>}<BR><BR>public static String getConfig(String key) {<BR>if ((configFile == null) || (props == null))<BR>init();<BR>if (configFile.lastModified() > fileLastModified)<BR>load();<BR>return props.getProperty(key);<BR>}<BR><BR>} </P> <P></P> <P>如果MBean在本地Q则可以用下面的Ҏ(gu)来获得:(x)</P> <P>ThreadPoolMBean poolMBean = (ThreadPoolMBean) MBeanProxyExt.create(ThreadPoolMBean.class, objName);</P> <P>q有一U远E获得的Ҏ(gu)Q从开源代码中看到的,未验证)(j)</P> <P>ThreadPoolMBean poolMBean = (ThreadPoolMBean) MBeanServerInvocationHandler.newProxyInstance(mbeanServer, objName, ThreadPoolMBean.class, false);</P><img src ="http://www.aygfsteel.com/chengang/aggbug/34078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/chengang/" target="_blank">陈刚</a> 2006-03-07 14:54 <a href="http://www.aygfsteel.com/chengang/archive/2006/03/07/34078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[JMX一步步来] 1、JMX的Hello Worldhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34061.html陈刚陈刚Tue, 07 Mar 2006 06:29:00 GMThttp://www.aygfsteel.com/chengang/archive/2006/03/07/34061.htmlhttp://www.aygfsteel.com/chengang/comments/34061.htmlhttp://www.aygfsteel.com/chengang/archive/2006/03/07/34061.html#Feedback1http://www.aygfsteel.com/chengang/comments/commentRss/34061.htmlhttp://www.aygfsteel.com/chengang/services/trackbacks/34061.html    ?陈刚 from www.chengang.com.cn at 2005-12-3

一、JMX?/STRONG>

  什么是JMXQ在一网文中是这栯的:(x)"JMX(Java Management Extensions)是一个ؓ(f)应用E序植入理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在Q何Java应用E序中用这些代理和服务实现理"Q这句话我现在看着q是不知所云,云里N?/DIV>

  我们q是从JMX能给我们提供什么好处入手来理解吧。D一个应用实例:(x)在一个系l中常常?x)有一些配|信息,比如服务的IP地址Q端口号什么的Q那么如何来写这些代码呢Q?/DIV>
  1. E序初哥一般是写死在程序里Q到要改变时去改程序,然后再编译发布;
  2. E序熟手则一般把q些信息写在一个配|文仉QJAVA一般都?.properties文gQ,到要改变时只要改配置文gQ但q是重新启动pȝQ以便读取配|文仉的新|
  3. E序好手则会(x)写一个段代码Q把配置值缓存v来,pȝ在读值的时候,先看看配|文件有没有更动。如有更改则重读一遍,否则从缓存里d?/LI>
  4. E序高手则懂得取物ؓ(f)我所用,用JMXQ把配置属性集中在一个类Q然后写一个叫MBean的东东,再配|一下就L搞定?jin)。而且JMX自动提供?jin)一个WEB面来给你来改变q些配置信息?/LI>

二、准备工?/STRONG>


  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)?/P>

  但JDK5.0q包含所有SUN的关于JMX的代码,有一些工L(fng)是排除在JDK5.0之外的。下面根据所使用的JDK版本情况Q谈一谈开发环境的准备?/DIV>
1、JDK1.3?.4
  去SUN|站下蝲SUN的JMX实现Q共两个ZIP文gQ下载网址Q?A >http://java.sun.com/products/JavaManagement/download.html?/DIV>
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引用中?/DIV>
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的项目库引用中?/DIV>
3、我使用的开发环境:(x)JDK5.0 Q?Eclipse3.2?/DIV>
  注:(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字样?/DIV>
 
3、创Z个Agentc?/DIV>
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?/DIV>
  • 先创Z(jin)一个MBeanServerQ用来做MBean的容?
  • Helloq个cL入到MBeanServer中,注入需要创Z个ObjectNamec?
  • 创徏一个AdaptorServerQ这个类决定MBean的管理界面,q里用最普通的Html型界面。AdaptorServer其实也是一个MBean?/LI>
  • chengang:name=HelloWorld的名字是有一定规则的Q格式ؓ(f)Q“域?name=MBean名称”,域名和MBean名称都可以Q意取?/LI>
4、运行HelloAgentQ然后打开|页Q?A href="http://localhost:8082/">http://localhost:8082/Q效果图如下Q?/DIV>
1133616885971_1841.jpg
单击“name=HelloWorld”链接进入,出现如下面
1133616990271_7574.jpg

依照下面U线的步骤操作之后,在控制台Q我用Eclipse是console视图Q得到如下输出:(x)

1133617125401_8322.jpg

五、ȝ

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

  预告Q下一将对JMXq行一些介l,借助本篇的HelloWorld实例来灌输一些概c(din)?/P>

作者简?/STRONG>

陈刚Q广西桂林hQ著作有《Eclipse从入门到_N?BR>(zhn)可以通过其博客了(jin)解更多信息和文章Q?A >http://www.chenGang.com.cn



陈刚 2006-03-07 14:29 发表评论
]]> վ֩ģ壺 ¡| | | | ̩˳| ζ| | | | | | ݶ| üɽ| | | Ȫ| | | | ޼| | ƽ| ƽ| ͬ| | Ϫ| | | ˳| ÷ӿ| ϴ| | Ԫ| ¹| ƽ| | | | | | |