zcx

          Commons Modeler 開發(fā)JMX應用

          ModelerJakarta Commons 針對Model MBeans提供的一個便利的開發(fā)組件

          首先介紹一下基本的概念:Managed bean簡稱Mbean,是對可被管理的資源的抽象定義,ModelBeanJMX定義的Mbean中動態(tài)和靈活的一種。但是要實現(xiàn)它開發(fā)人員必須設置大量的Metadata信息。Modeler組件針對ModelBean的開發(fā),通過采用xml來定義metadata的方式來簡化了ModelBean的開發(fā)強度,同時它和提供了注冊的支持和缺省的ModelMbean的支持。這些我們都將在下面的例子中看到。另外關(guān)于JMXModelMBean的介紹有很多可以參考。這里都不提了。

           

          下面主要通過例子來寫一下如何使用它進行JMX開發(fā)。

          在實際開發(fā)中,我們都是首先定義需要被管理的資源對象,然后把它注冊到MBeanServer中進行發(fā)布。最后再通過客戶端訪問。

          所以我的例子也通過這個來完成。

          1. 資源對象和MBean的實現(xiàn)

          首先編寫一個需要管理的對象。該對象很簡單有一個屬性和一個操作。

          public class TestBean {

              private String oneAttr;

              public String getOneAttr(){

                  return "one attribute be testing";

              }

              public void setOneAttr(String attr){

                  this.oneAttr = attr;

              }

             public String toString(){

                  return "toString be testing";

              }

          }

          根據(jù)需要被管理的要求編寫Mbeans-descriptors.xml

          <?xml version="1.0"?>

          <mbeans-descriptors>

            <mbean         name="TestBean"

                    description="the test bean"

                         domain="mydomain"

                          group="testGroup"

                           type="mbeans.TestBean">

              <attribute   name="oneAttr"

                    description="one Attr to be tested"

                           type="java.lang.String"

                      writeable="true"/>

              <operation   name="toString"

                    description="one Oper to be tested"

                         impact="INFO"

                     returnType="String">

              </operation>

            </mbean>

          </mbeans-descriptors>

           

          通過這個xml文件的定義就描述了ModelBean所需要的metadata信息和一個基本的ModelMBean的實現(xiàn)。

          關(guān)于這個xml文件有幾個需要說明的地方:

          <mbean>的屬性classname,nametype

          name屬性是每個MbeanRegistry對象注冊的對象名。

          type屬性是是真正被管理資源的全名(包括包名)。

          classname屬性是用戶擴展的用于實現(xiàn)代理功能的ModelMbean的全名,如果不提供Modeler會使用BaseModelMBean;如果提供了代理的ModelMBean對象,在使用時可以使用如下的代碼樣本訪問他所代理的資源對象。

           Function foo(){

                        TestObject object = this.resource;  //得到所代理的對象。

                        Object.foo();                                     //具體實現(xiàn)的調(diào)用。

          }

          Mbeans-descriptors.xml的其他的部分都比較好理解,具體參考DTD就可以了。

          下面我們就要把完成MBeanServer的實現(xiàn)和Mbean的注冊。

           

          2. MBeanServer的實現(xiàn)和MBean的注冊

          MBeanServer的實現(xiàn)代碼:

                  registry = Registry.getRegistry();

                  InputStream stream = MyMBeanServer.class

                          .getResourceAsStream("Mbeans-descriptors.xml");

                 registry.loadRegistry(stream);

                 stream.close();

                 mserver = registry.getMBeanServer();

           

          通過Modeler組件提供的Registry對象,可以很方便的完成MBeanServer的創(chuàng)建。

          MBean的注冊代碼:

                        /*創(chuàng)建被管理的資源實例*/

                      TestBean bean = new TestBean();  

                        /*Modeler組件提供的對managedbean配置信息的封裝對象,通過它建立資源和ModelMBean的聯(lián)系*/

                  ManagedBean managed = registry.findManagedBean("TestBean");

                  String domain = managed.getDomain();

                        /*得到ModelMbean*/

                  ModelMBean mbean = managed.createMBean(bean);

                        /*創(chuàng)建ObjectName*/

                  ObjectName oname = new ObjectName(domain+":test=zcx");

                        /*注冊MBean*/

                  mserver.registerMBean(mbean,oname);

              

          3. MBeanServerConnector的實現(xiàn)。

          JMXRemoteAPI 發(fā)布之后,Agent需要提供ConnectorServer,我們可以這樣注冊一個JMXMPConnectorServer.

                    /*定義JMXServiceURL這個對象是客戶端和服務器聯(lián)系的關(guān)鍵*/

                JMXServiceURL address = new JMXServiceURL("jmxmp", null, 7777);

                connectorSrv=JMXConnectorServerFactory.newJMXConnectorServer(address, null, null);

                ObjectName csName = new ObjectName(":type=cserver,name=mycserver");

                mserver.registerMBean(connectorSrv, csName);

                 connectorSrv.start();

           

          在這里需要說明的是通過JMXServiceURL的可以定義ConnectorServer的類型是JMXMP,RMI或者其他什么類型。按照規(guī)范規(guī)定這個JMXServiceURL應該在服務器端通過JNDI或者SLP等進行發(fā)布。然后客戶端通過相應的訪問得到這個對象,進行通信。如何通過JNDI訪問這個對象,我就不在這里寫了。

          4. MBeanServerAdaptor的實現(xiàn)。

                madaptor = new HtmlAdaptorServer();

                  mserver.registerMBean(madaptor,new,ObjectName("adaptor:protocol=HTTP"));

                  madaptor.setPort(8888);

                     madaptor.start();

           

          5. MBeanClient的實現(xiàn)。

           

          使用http瀏覽器,我們可以通過HtmlAdaptorServer訪問MBean

           

          另外我們通過JMXRemoteAPI也可以在客戶端訪問MBean

          客戶端代碼如下:

          JMXServiceURL address = new  JMXServiceURL("jmxmp","zcx" , 7777);

          connector = JMXConnectorFactory.connect(address);

          mbsConn = connector.getMBeanServerConnection();

           

          通過MBeanServerConnection對象我們可以對MBean進行各種操作。

           

          到這里一個簡單的JMX的應用流程就完成了。J

           

           

           

          posted on 2005-01-11 18:05 zcx 閱讀(2137) 評論(1)  編輯  收藏
          Comments
          • # re: 用Commons Modeler 開發(fā)JMX應用
            LeighSword
            Posted @ 2005-01-11 18:14
            model MBeans are the most flexible,but hard to set it up.  回復  更多評論   

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
           
          主站蜘蛛池模板: 文化| 榆中县| 磐安县| 常宁市| 丹寨县| 濉溪县| 湘潭市| 张家界市| 万源市| 丹凤县| 蓬溪县| 呈贡县| 富蕴县| 伊宁市| 静海县| 乌苏市| 延安市| 玉溪市| 潜山县| 南通市| 玉屏| 得荣县| 镇江市| 墨竹工卡县| 台南县| 咸宁市| 乌拉特后旗| 杂多县| 浮梁县| 霞浦县| 虎林市| 广东省| 新平| 嘉祥县| 拉孜县| 洞口县| 枝江市| 荔波县| 西充县| 南川市| 陆河县|