当前位置:网站首页>JMX、MBean、MXBean、MBeanServer 入门
JMX、MBean、MXBean、MBeanServer 入门
2022-07-03 09:04:00 【单手入天象】
一、概念
1.JMX
百度百科的解释是:
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
通俗点说:
JMX 是一个 JDK 提供的框架,用来管理检测 Java 程序,提供了对 Java 应用程序和 JVM 的监控和管理功能。
JMX 通过 MBean、MXBean、MBeanServer 来实现对 java 程序的管理
2.MBean
MBean 是一种规范的 JavaBean,他集成和实现一套标准的Bean接口,这种 bean 叫 MBean,Mbean 需要注册到 MBeanServer 中被管理。
用法规范:需要定义一个名字结尾为 MBean 的接口,例如:创建一个 StudentMBean 接口,然后这个接口的实现类的名字必须叫做 Student,这时候这个 Student 的 bean 就是 MBean。
3.MXBean
MXBean 是 MBean 的广义变体,MXBean 与 MBean 的区别主要是在于在接口中会引用到一些自定义类型的类(非原生类型,int、String 等),当 JMX 使用这个 MXBean 时,这个自定义类型的类就会被转换成一种标准的类型,CompositeDataSupport 类。
用法规范:它和 MBean 的用法规范是一样的,只是接口的名字结尾为 MXBean
需要注意的是:如果你的 MXBean 自己定义了带参构造函数(无参构造被覆盖),会报错:
Do not know how to make a JavaFTP.Book from a CompositeData: no method from(CompositeData); no constructor has @ConstructorProperties annotation; does not have a public no-arg constructor; not an interface
解决办法就是:手动添加无参构造函数
4.MBeanServer
MBeanServer 是 JMX 代理层的核心管理者,所有 MBean 都需要向 MBeanServer 注册,所有对 MBean 的操作都是通过 MBeanServer 来执行的。
在 MBeanServer 中,每一个 MBean 都有一个唯一标志 ObjectName 与之绑定。
二、代码例子
1.MBean
定义一个 MBean 接口
public interface StudentMBean {
public int getAge();
public String getName();
public String getEmail();
public void setEmail(String email);
public String sayHello();
}
实现类,也就是 MBean
public class Student implements StudentMBean {
private final int age;
private final String name;
private String email;
public Student(int age, String name, String email) {
this.age = age;
this.name = name;
this.email = email;
}
@Override
public int getAge() {
return age;
}
@Override
public String getName() {
return name;
}
@Override
public String getEmail() {
return email;
}
@Override
public void setEmail(String email) {
this.email = email;
}
@Override
public String sayHello() {
return "hello " + name;
}
}
测试类:
public class MBeanServerTest {
public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName student_objectName = new ObjectName("com.liqiye.jmx.mbean:type=Student");
Student student = new Student(26,"liqiye","[email protected]");
mBeanServer.registerMBean(student, student_objectName);
Thread.sleep(Long.MAX_VALUE);
}
}
运行 main 方法后,打开你 JDK 的 /bin 目录 下的 jconsole.exe
可以看到有 java 程序执行时 JDK 内置的 MBean,还有我们刚才定义的 Student 这个 MBean
2.MXBean
定义一个 MXBean 接口
public interface TeacherMXBean {
public int getAge();
public String getName();
public String getEmail();
public void setEmail(String email);
public String sayHello();
public List<Book> getBook();
public void addBook(Book book);
}
实现类,也就是 MXBean
public class Teacher implements TeacherMXBean {
private final int age;
private final String name;
private String email;
private List<Book> books;
public Teacher(int age, String name, String email) {
this.age = age;
this.name = name;
this.email = email;
this.books = new ArrayList<>();
}
@Override
public int getAge() {
return age;
}
@Override
public String getName() {
return name;
}
@Override
public String getEmail() {
return email;
}
@Override
public void setEmail(String email) {
this.email = email;
}
@Override
public String sayHello() {
return "hello " + name;
}
@Override
public List<Book> getBook() {
return books;
}
@Override
public void addBook(Book book) {
books.add(book);
}
}
测试类:
public class MBeanServerTest {
public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName("com.liqiye.jmx.mbean:type=Student");
ObjectName teacher_objectName = new ObjectName("com.liqiye.jmx.mxbean:type=Teacher");
Book book = new Book("java书", 30L);
Teacher teacher = new Teacher(27, "小七", "11");
teacher.addBook(book);
mBeanServer.registerMBean(teacher, teacher_objectName);
Thread.sleep(Long.MAX_VALUE);
}
}
jconsole 中能看到 MXBean 中有 Book 这个自定义类的属性,并且能获取到里面的值
总结
欢迎指出我的错误!
边栏推荐
- Apply for domain name binding IP to open port 80 record
- 307. Range Sum Query - Mutable
- Learning C language from scratch -- installation and configuration of 01 MinGW
- 2021-09-26
- About the configuration of vs2008+rade CATIA v5r22
- Epoll read / write mode in LT and et modes
- Jetson Nano 自定义启动图标kernel Logo cboot logo
- Leetcode daily question (968. binary tree cameras)
- Win10安装ELK
- Flink-CDC实践(含实操步骤与截图)
猜你喜欢
LeetCode每日一题(2212. Maximum Points in an Archery Competition)
MySQL data manipulation language DML common commands
Flask+supervisor installation realizes background process resident
UCI and data multiplexing are transmitted on Pusch - determine the bit number of harqack, csi1 and csi2 (Part II)
PolyWorks script development learning notes (II) -treeview basic operations
Flink learning notes (XI) table API and SQL
UCI and data multiplexing are transmitted on Pusch (Part 4) --small block lengths
[CSDN] C1 training problem analysis_ Part III_ JS Foundation
PolyWorks script development learning notes (4) - data import and alignment using file import
Definition and use of enum in C language
随机推荐
UCI and data multiplexing are transmitted on Pusch - placement of data and UCI positions (Part III)
小王叔叔的博客目录【持续更新中】
Usage of pandas to obtain MySQL data
unbuntu(debian)下TFTP服务器搭建及测试
【男保姆式】教你打开第一个微信小程序
CATIA automation object architecture - detailed explanation of application objects (I) document/settingcontrollers
Analysis of the implementation principle of an open source markdown to rich text editor
软件测试工程师是做什么的 通过技术测试软件程序中是否有漏洞
数字身份验证服务商ADVANCE.AI顺利加入深跨协 推进跨境电商行业可持续性发展
Nr-prach: access scenario and access process
Spark 概述
[CSDN]C1训练题解析_第三部分_JS基础
PolyWorks script development learning notes (II) -treeview basic operations
PowerDesigner does not display table fields, only displays table names and references, which can be modified synchronously
Development of electrical fire system
LeetCode每日一题(1162. As Far from Land as Possible)
How does the nr-prach receiver detect the relationship between prembleid and Ta
The server denied password root remote connection access
Spark cluster installation and deployment
Trial of the combination of RDS and crawler