子在川上曰

            逝者如斯夫不舍晝夜
          隨筆 - 71, 文章 - 0, 評論 - 915, 引用 - 0
          數(shù)據(jù)加載中……

          [JMX一步步來] 8、編寫程序來連接MBean

          文/陳剛  from www.chengang.com.cn at 2005-12-26
           
            前面用Html、jconsole等方法連接上了MBeanServer,并能夠通過這些界面來操縱MBean。但有時我們需要不借助這些客戶端,而是在自己的程序來操縱這些MBean,這就要求我們知道如何在代碼里連接MBean。
           
            基于上一篇為jconsole而修改的例子,給出一個示例的客戶端程序,基本的操作都有了:

          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都打印出來
                  System.out.println("Domains:---------------");
                  String domains[] = mbsc.getDomains();
                  for (int i = 0; i < domains.length; i++) {
                      System.out.println("\tDomain[" + i + "] = " + domains[i]);
                  }
                  //MBean的總數(shù)
                  System.out.println("MBean count = " + mbsc.getMBeanCount());
                  //對name屬性的操作(屬性名的第一個字母要大寫)
                  mbsc.setAttribute(mbeanName, new Attribute("Name", "Chen.Gang"));//設(shè)值
                  System.out.println("Name = " + mbsc.getAttribute(mbeanName, "Name"));//取值
                  //得到proxy代理后直接調(diào)用的方式
                  HelloMBean proxy = (HelloMBean) MBeanServerInvocationHandler.newProxyInstance(mbsc, mbeanName, HelloMBean.class, false);
                  proxy.printHello();
                  proxy.printHello("陳剛");
                  //遠程調(diào)用的方式
                  mbsc.invoke(mbeanName, "printHello", null, null);
                  mbsc.invoke(mbeanName, "printHello", new Object[] { "子在川上曰" }, new String[] { String.class.getName() });
                  //得mbean的信息
                  MBeanInfo info = mbsc.getMBeanInfo(mbeanName);
                  System.out.println("Hello Class: " + info.getClassName());
                  System.out.println("Hello Attriber:" + info.getAttributes()[0].getName());
                  System.out.println("Hello Operation:" + info.getOperations()[0].getName());
                  //得到所有的MBean的ObjectName
                  System.out.println("all ObjectName:---------------");
                  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);
                  //關(guān)閉MBeanServer連接
                  jmxc.close();
              }
          }
           
          運行后的效果如下:
          Domains:---------------
           Domain[0] = HelloAgent
           Domain[1] = JMImplementation
           Domain[2] = chengang
          MBean count = 3
          Name = Chen.Gang
          Hello Class: mbean.connector.Hello
          Hello Attriber:Name
          Hello Operation:printHello
          all ObjectName:---------------
           chengang:name=HelloWorld
           JMImplementation:type=MBeanServerDelegate
           HelloAgent:name=htmladapter,port=8082
           
           
          它有兩個Console輸出,這里是另一個
          Hello World, Chen.Gang
          Hello , 陳剛
          Hello World, Chen.Gang
          Hello , 子在川上曰
           

          作者簡介

          陳剛,廣西桂林人,著作有《Eclipse從入門到精通》
          您可以通過其博客了解更多信息和文章:http://www.chenGang.com.cn

          posted on 2006-03-07 15:17 陳剛 閱讀(5161) 評論(2)  編輯  收藏 所屬分類: JMX

          評論

          # re: [JMX一步步來] 8、編寫程序來連接MBean  回復  更多評論   

          在項目中通過用RMI方式連接JMX 的mbeans,如果JDK是1.5的話連接不會出錯,可是換到j(luò)dk1.4的話會報錯,我jmx的5個jar包都在環(huán)境里面.
          想問下有沒有能在jdk1.4中也能正常運行的辦法,

          付上exception:
          java.rmi.ServerError: Error occurred in server thread; nested exception is:
          java.lang.NoSuchMethodError: javax.management.MBeanServer.getClassLoaderRepository()Ljavax/management/loading/Cl
          assLoaderRepository;
          at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:289)
          at sun.rmi.transport.Transport$1.run(Transport.java:148)
          at java.security.AccessController.doPrivileged(Native Method)


          2006-12-19 17:11 | jmx初學者

          # re: [JMX一步步來] 8、編寫程序來連接MBean[未登錄]  回復  更多評論   

          Refer to http://forum.java.sun.com/thread.jspa?threadID=5229139
          2008-05-15 09:58 | Tim
          主站蜘蛛池模板: 滦平县| 宁阳县| 新营市| 大姚县| 盐源县| 河曲县| 罗田县| 盐城市| 临武县| 收藏| 东乌珠穆沁旗| 建湖县| 兴山县| 彭泽县| 临朐县| 依安县| 阳信县| 安西县| 田东县| 定安县| 尼勒克县| 兴宁市| 弥勒县| 松滋市| 平乡县| 九龙坡区| 梁山县| 东乌珠穆沁旗| 武夷山市| 大连市| 新邵县| 布尔津县| 淮北市| 蕉岭县| 寻甸| 尤溪县| 攀枝花市| 蛟河市| 大港区| 淮安市| 寻乌县|