原文链接:https://www.cnblogs.com/trust-freedom/p/6842332.html
作者:Trust_FreeDom - 博客园
博客主页:http://www.cnblogs.com/trust-freedom/
根据原文的实践如下(没有完全按照原文来):
- HelloMBean.java
package com.test;
public interface HelloMBean {
String getName();
void setName(String name);
void printHello();
void printHello(String whoName);
}
- Hello.java
package com.test;
/**
* @Author mubi
* @Date 2018/10/5 下午12:41
*/
public class Hello implements HelloMBean {
private String name;
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void printHello() {
System.out.println("Hello world, " + name);
}
@Override
public void printHello(String whoName) {
System.out.println("Hello, " + whoName);
}
}
- HelloAgent.java
package com.test;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.time.LocalTime;
import java.util.Date;
public class HelloAgent {
public static void main(String[] args) throws Exception {
// 首先建立一个MBeanServer,MBeanServer用来管理我们的MBean,通常是通过MBeanServer来获取我们MBean的信息
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
String domainName = "MyMBean";
// 为MBean(下面的new Hello())创建ObjectName实例
ObjectName helloName = new ObjectName(domainName+":name=HelloWorld");
// 将new Hello()这个对象注册到MBeanServer上去
server.registerMBean(new Hello(),helloName);
/**
* JMXConnectorServer service
*/
//这句话非常重要,不能缺少!注册一个端口,绑定url后,客户端就可以使用rmi通过url方式来连接JMXConnectorServer
Registry registry = LocateRegistry.createRegistry(1099);
//构造JMXServiceURL
JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
//创建JMXConnectorServer
JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, server);
//启动
cs.start();
}
}
- 运行后使用
jconsole
查看(JAVA_HOME目录bin/jconsole
)
- 编写客户端
package com.test;
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;
/**
* @Author mubi
* @Date 2018/10/5 下午3:10
*/
public class JMXClient {
public static void main(String[] args) throws Exception {
//connect JMX
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url,null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
String domainName = "MyMBean";
ObjectName mbeanName = new ObjectName(domainName+":name=HelloWorld");
//print domains
System.out.println("Domains:---------------");
String domains[] = mbsc.getDomains();
for (int i = 0; i < domains.length; i++) {
System.out.println("Domain[" + i +"] = " + domains[i]);
}
System.out.println();
//MBean count
System.out.println("MBean count:---------------");
System.out.println("MBean count = " + mbsc.getMBeanCount());
System.out.println();
//process attribute
System.out.println("process attribute:---------------");
//set value
mbsc.setAttribute(mbeanName, new Attribute("Name", "newName"));
//get value
System.out.println("Name = " + mbsc.getAttribute(mbeanName, "Name"));
System.out.println();
//invoke via proxy
System.out.println("invoke via proxy:---------------");
HelloMBean proxy = (HelloMBean)MBeanServerInvocationHandler.newProxyInstance(mbsc, mbeanName, HelloMBean.class, false);
proxy.printHello();
proxy.printHello("zhangsan");
System.out.println();
//invoke via rmi
System.out.println("invoke via rmi:---------------");
System.out.println(mbsc.invoke(mbeanName, "printHello", null, null));
System.out.println(mbsc.invoke(mbeanName, "printHello", new Object[] { "lisi" }, new String[] { String.class.getName() }));
System.out.println();
//get mbean information
System.out.println("get mbean information:---------------");
MBeanInfo info = mbsc.getMBeanInfo(mbeanName);
System.out.println("Hello Class:" + info.getClassName());
System.out.println("Hello Attribute:" + info.getAttributes()[0].getName());
System.out.println("Hello Operation:" + info.getOperations()[0].getName());
System.out.println();
//ObjectName of MBean
System.out.println("ObjectName of MBean:---------------");
Set set = mbsc.queryMBeans(null, null);
for (Iterator it = set.iterator(); it.hasNext();) {
ObjectInstance oi = (ObjectInstance)it.next();
System.out.println(oi.getObjectName());
}
jmxc.close();
}
}
- 运行结果:
参考:
JMX百度百科:https://baike.baidu.com/item/JMX/2829357?fr=aladdin