hengheng123456789

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
          利用 JBossMX 開發(fā)標(biāo)準(zhǔn) MBean

          原文(http://www.ebook520.com/showbooktext.asp?id=2090&backcolor=E7F4FE&backsize=15

          ???JBoss
          服務(wù)器是建立在 JBoss JMX 實(shí)現(xiàn)工具( JBossMX )基礎(chǔ)上的,訪問 JBoss 網(wǎng)站( http://www.jboss.org )可以下載到獨(dú)立的 JBoss JMX 實(shí)現(xiàn)工具軟件包 。將下載到的 jbossmx-1.1.2.zip 壓縮包解壓之后,把下列 jar 文件添加到 CLASSPATH 中:

          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

          標(biāo)準(zhǔn)

          MBean JBoss 中使用范圍最廣, JBoss 中的許多組件都是利用標(biāo)準(zhǔn) MBean 開發(fā)的。

          1 .計(jì)數(shù)器 MBean

          下面是一個(gè)計(jì)數(shù)器 MBean 的開發(fā)示例。

          1 )確定 MBean 的接口。

          分析計(jì)數(shù)器的功能,確定了兩個(gè)方法, add() get() add() 負(fù)責(zé)加數(shù), get() 負(fù) 責(zé)加數(shù)并取回總數(shù):

          package com.liuyang.jmx.mbeans.counter;

          public interface CounterMBean {

          ??? public void add(int num);

          ??? public int get(int num);???

          }

          從代碼中可以看到,開發(fā)標(biāo)準(zhǔn) MBean MBean 接口和開發(fā)普通接口除了需要在 MBean 類名稱后面加上“ MBean ”之外,沒有其他區(qū)別。

          2 )實(shí)現(xiàn) MBean 接口。

          CounterMBean 是一個(gè)標(biāo)準(zhǔn) MBean ,所以 MBean 實(shí)現(xiàn)類的名稱必須和 MBean 接口 之間遵守標(biāo)準(zhǔn) MBean 的命名規(guī)范,所以 CounterMBean 的實(shí)現(xiàn)類 Counter CounterMBean 少了尾部的 MBean 部分,下面是 Counter 的實(shí)現(xiàn)代碼:

          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;

          }

          }

          從代碼中也可以看到,標(biāo)準(zhǔn) MBean 實(shí)現(xiàn)類與普通的 Java 程序也沒什么區(qū)別。

          3 )利用 JMX API 編寫調(diào)用 CounterMBean 的程序。

          JMX API Sun 公司為 JMX 技術(shù)所設(shè)計(jì)的一套用來(lái)開發(fā) JMX 應(yīng)用的編程接口,通過 JMX API 可以管理和控制前面開發(fā)的 CounterMBean 資源。下面是利用 JMX API 編寫調(diào)用 CounterMBean 的程序代碼:

          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 ObjectName

          ObjectName 代表一個(gè) MBean 對(duì)象的名,創(chuàng)建一個(gè) ObjectName 需要符合 MBean 的命名規(guī)范,例如:

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

          3 MBeanServer

          CounterServer 程序中,首先創(chuàng)建的 MBeanServer 這個(gè)對(duì)象代表前文中介紹的 MBean 服務(wù)器,它負(fù)責(zé)管理 MBean 資源,每個(gè) MBean 資源可以被注冊(cè)到 MBeanServer 之中:

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

          通過 MBeanServer invoke 方法還可以調(diào)用一個(gè) MBean ,在調(diào)用時(shí)需要傳遞一些與調(diào)用有關(guān)的參數(shù):

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

          其中:

          name 是被調(diào)用對(duì)象的對(duì)象名。

          "add" 要求 調(diào)用被調(diào)對(duì)象的方法名稱。

          opArgs1 是一個(gè)數(shù)組,包含著的每個(gè)數(shù)據(jù)將被作為參數(shù)傳遞到被調(diào)方法。

          sig1 一個(gè)數(shù)組,包含著將被作為參數(shù)傳遞的每個(gè)數(shù)據(jù)的數(shù)據(jù)類型。

          調(diào)用之后返回的對(duì)象包含著執(zhí)行的結(jié)果。

          4 MBeanServerFactory

          MBeanServerFactory 是產(chǎn)生 MBeanServer 的工廠類,使用的 JMX 實(shí)現(xiàn)工具不同,通過 MBeanServerFactory 創(chuàng)建的 MBeanServer 實(shí)現(xiàn)對(duì)象也不同。如果 MBeanServer 已經(jīng)被創(chuàng)建了,那么可以通過下面的方法獲取:

          MBeanServer server = MBeanServerFactory.newMBeanServer();

          通過這個(gè)實(shí)例,可以了解到使用 MBeanServer 來(lái)控制 MBean 的基本方法,下面的 用戶查詢 MBean 將進(jìn)一步介紹通過 MBeanServer 對(duì) MBean 的屬性進(jìn)行查詢的方法。

          5 .用戶查詢 MBean

          首先,確定 MBean 的接口。

          用戶查詢 MBean 中的用戶是這個(gè) MBean 所代表的對(duì)象,這個(gè)設(shè)計(jì)的用戶包括名稱和角色,在這個(gè)例子中將對(duì)這兩個(gè)屬性進(jìn)行監(jiān)控,這是 JMX 為開發(fā)者提供的一種機(jī)制,所有被管理的 MBean 都在 MBeanServer 的控制之中,這個(gè)控制不僅包括上個(gè)計(jì)數(shù)器實(shí)例中所演示的方法調(diào)用功能,也包含對(duì)這些 MBean 的相關(guān)信息進(jìn)行考察的功能。

          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 中被設(shè)定了兩個(gè)屬性: name role ,并遵照 Java Bean 的規(guī)則為它們提供了 get() set() 方法。通過這兩個(gè)方法可以設(shè)定 UserMBean 的兩個(gè)屬性。

          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 這個(gè)類只是以最簡(jiǎn)單的方式實(shí)現(xiàn)了 UserMBean 接口。

          UserQueries 演示了 通過 MBeanServer 對(duì) MBean 的屬性進(jìn)行查詢的方法,代碼如下:

          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 的名字是: 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 的角色是: test");

          while (it.hasNext()) {

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

          }

          }

          }

          UserQueries 中創(chuàng)建了兩個(gè) MBean 對(duì)象:

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

          這是 MBeanServer 通過 MBean 類的名稱創(chuàng)建 MBean 實(shí)例的方法。

          然后分別設(shè)置它們的屬性:

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

          一個(gè) Attribute 對(duì)象代表一個(gè)屬性。

          JMX API 為查詢服務(wù)建立標(biāo)準(zhǔn)的接口方法,第一步是建立查詢表達(dá)式:

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

          這個(gè)查詢表達(dá)式是以全匹配的方式進(jìn)行的, JMX 還支持部分模糊查詢的功能:

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

          initialSubString 建立的查詢方法只會(huì)匹配名稱的開始部分,在這里只要以“ t ”開頭的值都會(huì)被匹配。

          然后,通過一個(gè) MBean 名稱對(duì)象來(lái)代表查詢范圍:

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

          最后,通過 MBeanServer 執(zhí)行查詢表達(dá)式的操作,得到結(jié)果:

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

          運(yùn)行 UserQueries 可以得到查詢結(jié)果。

          posted on 2006-12-21 11:05 哼哼 閱讀(1326) 評(píng)論(0)  編輯  收藏 所屬分類: JMX
          主站蜘蛛池模板: 石门县| 连云港市| 文水县| 镶黄旗| 广宁县| 理塘县| 凌海市| 吉林省| 微博| 泰和县| 延庆县| 静安区| 平利县| 丰镇市| 弋阳县| 济宁市| 南木林县| 桦南县| 响水县| 青州市| 海兴县| 南安市| 龙游县| 平湖市| 建瓯市| 阿坝| 丹寨县| 麻城市| 孝昌县| 奎屯市| 军事| 垫江县| 永修县| 峨眉山市| 岳阳县| 江城| 宁海县| 大余县| 喜德县| 从江县| 旬邑县|