[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
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 , 子在川上曰
Hello , 陳剛
Hello World, Chen.Gang
Hello , 子在川上曰
作者簡介
陳剛,廣西桂林人,著作有《Eclipse從入門到精通》
您可以通過其博客了解更多信息和文章:http://www.chenGang.com.cn
posted on 2006-03-07 15:17 陳剛 閱讀(5161) 評論(2) 編輯 收藏 所屬分類: JMX