前面用Html、jconsole等方法连接上了MBeanServer,并能够通过这些界面来操纵MBean。但有时我们需要不借助这些客户端,而是在自己的程序来操纵这些MBean,这就要求我们知道如何在代码里连接MBean。
1.HelloMBean
package jmx.mbean;
/* HelloMBean.java - MBean interface describing the management
operations and attributes for the Hello World MBean. In this case
there are two operations, "sayHello" and "add", and two attributes,
"Name" and "CacheSize". */
/**
* HelloMBean定义方法及属性由Hello实现
*/
public interface HelloMBean {
public String getName();
public void setName(String name);
public void printHello();
public void printHello(String whoName);
}
2.Hello
package jmx.mbean;
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);
}
}
3.HelloAgent
package jmx.mbean;
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("jmx: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.....");
//创建rmi连接并开启
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.....");
}
}
4.Client
package jmx.mbean;
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("jmx: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的总数
System.out.println("MBean count = " + mbsc.getMBeanCount());
// 对name属性的操作(属性名的第一个字母要大写)
mbsc.setAttribute(mbeanName, new Attribute("Name", "yuwen"));// 设值
System.out.println("Name = " + mbsc.getAttribute(mbeanName, "Name"));// 取值
// 得到proxy代理后直接调用的方式
HelloMBean proxy = (HelloMBean) MBeanServerInvocationHandler
.newProxyInstance(mbsc, mbeanName, HelloMBean.class, false);
proxy.printHello();
proxy.printHello("yuwen");
// 远程调用的方式
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);
// 关闭MBeanServer连接
jmxc.close();
}
}
5.运行
(1)在Dos运行一个命令:rmiregistry 9999
(2)运行HelloAgent
(3)运行Client
运行结果有两个
HelloAgent控制台
Hello World, yuwen
Hello , yuwen
Hello World, yuwen
Hello , 你好
------------------------------------
Client控制台
Domains:---------------
Domain[0] = JMImplementation
Domain[1] = jmx
Domain[2] = HelloAgent
MBean count = 3
Name = yuwen
Hello Class: jmx.mbean.Hello
Hello Attriber:Name
Hello Operation:printHello
all ObjectName:---------------
JMImplementation:type=MBeanServerDelegate
HelloAgent:name=htmladapter,port=8082
jmx:name=HelloWorld
本人开了个充值淘宝网店。有需要的朋友请访问的店铺并拍下所充值的话费,
本店已加入消费保障服务计划,货源来源于淘宝充值平台,安全可靠便捷,
支付过后立即到账