共计 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); | |
} | |
} |
正文完