共计 4765 个字符,预计需要花费 12 分钟才能阅读完成。
JMX(Java Management Extensions) 是一个为应用程序植入治理性能的框架。JMX 是一套规范的代理和服务,次要用于对 JAVA 应用程序和 JVM 进行监控和治理。
JConsole 和 JVisualVM 中可能监控到 JAVA 应用程序和 JVM 的相干信息都是通过 JMX 实现的。
散布层:是 JMX 架构对外一层,散布层负责应用 JMX 代理对外部世界可用。有两种类型的分布式交互。第一种类型是由适配器来实现,它通过 HTTP 或 SNMP 一类的协定提供了 MBean 的可见性。第二种类型是连接器,它将代理的 API 裸露给其它分布式技术,如 Java RMI。(治理拜访框架接口)代理层:代理层次要组件是 MBean 服务器,MBean 服务器提供 MBean 的注册应用,它是 JMX 代理的外围。(拜访资源接口)指令层:指令层是靠近治理资源的一层,它由代理中注册的 MBean 形成 MBean 使得资源能够通过代理来被治理。(解决资源)
package test;
/**
* MBean 中各办法的参数和返回值的类型做严格限度,* 这些类型只能是根本类型 (String,int,double,float...)
* 以及 JMX 标准指定的 CompositeDataSupport(用于组合根本类型)*/
public class Hello implements HelloMBean {public void sayHello() {System.out.println("hello, world");
}
public int add(int x, int y) {System.out.println("add done"+x+" "+y);
return x + y;
}
public String getName() {return this.name;}
public int getCacheSize() {return this.cacheSize;}
public synchronized void setCacheSize(int size) {
this.cacheSize = size;
System.out.println("Cache size now" + this.cacheSize);
}
private final String name = "Reginald";
private int cacheSize = DEFAULT_CACHE_SIZE;
private static final int DEFAULT_CACHE_SIZE = 200;
}
package test;
import javax.management.Notification;
import javax.management.NotificationListener;
public class HelloListener implements NotificationListener {public void handleNotification(Notification notification, Object handback) {if (handback instanceof Hello) {Hello hello = (Hello) handback;
hello.add(Integer.parseInt(notification.getMessage()), 1);
}
}
}
package test;
/**
* 接口名必须以 MBean 结尾
*/
public interface HelloMBean {public void sayHello();
public int add(int x, int y);
public String getName();
public int getCacheSize();
public void setCacheSize(int size);
}
package test;
import javax.management.Notification;
import javax.management.NotificationBroadcasterSupport;
public class Jack extends NotificationBroadcasterSupport implements JackMBean {
private int seq = 0;
public void say(int a) {
// 创立一个信息包
Notification notify =
// 告诉名称;谁发动的告诉;序列号;发动告诉工夫;发送的音讯
new Notification("jack.hi", this, ++seq, System.currentTimeMillis(), a+"");
sendNotification(notify);
}
}
package test;
public interface JackMBean {void say(int a);
}
package test;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
/*
ClassLoadingMXBean Java 虚拟机的类加载零碎。CompilationMXBean Java 虚拟机的编译系统。MemoryMXBean Java 虚拟机的内存零碎。ThreadMXBean Java 虚拟机的线程零碎。RuntimeMXBean Java 虚拟机的运行时零碎。OperatingSystemMXBean Java 虚拟机在其上运行的操作系统。GarbageCollectorMXBean Java 虚拟机中的垃圾回收器。MemoryManagerMXBean Java 虚拟机中的内存管理器。MemoryPoolMXBean Java 虚拟机中的内存池。*/
public class JMXClient {public static void main(String[] args) throws Exception {
JMXServiceURL url =
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:9999/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection conn = jmxc.getMBeanServerConnection();
String[] domains = conn.getDomains();
for (String domain : domains) {// System.out.println(domain);
}
ObjectName name = new ObjectName("test:type=Hello");
MBeanInfo mBeanInfo = conn.getMBeanInfo(name);
// 获取 mbean 信息
System.out.println(mBeanInfo.toString());
// 获取属性
Object o = conn.getAttribute(name, "CacheSize");
System.out.println(o);
Object o2 = conn.getAttribute(name, "Name");
System.out.println(o2);
HelloMBean helloMBean = MBeanServerInvocationHandler.newProxyInstance(conn, name, HelloMBean.class, true);
// 调用办法
helloMBean.sayHello();
// 设置值
helloMBean.setCacheSize(100);
ObjectName name2 = new ObjectName("test:type=Jack");
JackMBean jackMBean = MBeanServerInvocationHandler.newProxyInstance(conn, name2,
JackMBean.class, true);
jackMBean.say(2);
// 获取 jvm 自带的
ObjectName o3 = new ObjectName("java.lang:type=ClassLoading");
MBeanInfo mBeanInfo1 = conn.getMBeanInfo(o3);
Object TotalLoadedClassCount = conn.getAttribute(o3,"TotalLoadedClassCount");
System.out.println(mBeanInfo1);
System.out.println(TotalLoadedClassCount);
}
}
package test;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
/**
* 如果要近程拜访,被拜访 Mbean 服务器首选须要 命令行选项启动近程虚拟机,这些选项设置虚拟机的相干 JMX 代理侦听申请的端口,以及起作用的安全级别如下:* -Dcom.sun.management.jmxremote.port=9999 -- 指定端口
* -Dcom.sun.management.jmxremote.authenticate=false – 指定是否须要明码验证
* -Dcom.sun.management.jmxremote.ssl=false – 指定是否应用 SSL 通信
*/
public class JMXServer {public static void main(String[] args) throws Exception {
/**
* 1、通过工厂类获取 Mbean Server,用来做 Mbean 的容器
* 2、ObjectName 的取名标准:域名:name=Mbean 名称,其中域名和 Mbean 的名称能够任取。这样定义后,咱们能够惟一标示咱们定义的这个 Mbean 的实现类了
* 3、最初将 Hello 这个类注册到 MbeanServer 中,注入须要创立一个 ObjectName 类
*/
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("test:type=Hello");
Hello mbean = new Hello();
mbs.registerMBean(mbean, name);
ObjectName name2 = new ObjectName("test:type=Jack");
Jack jack = new Jack();
// 设置告诉
jack.addNotificationListener(new HelloListener(),null,mbean);
mbs.registerMBean(jack, name2);
System.out.println("Waiting forever...");
Thread.sleep(Long.MAX_VALUE);
}
}
正文完