实践平台
- jdk1.8.0_191
- windows10
JMX
Java Management Extensions
最基本的功能就是为了管理 java 程序。
JMX 三层架构简介
Instrumentation layer
这个就是 MBean 负责监控应用程序。
JMX agent layer
MBean Server,MBean 注册到 MBean Server 。或者从 MBean Server 注销
Remote management layer
连接到 Java 进程,来观察、操作注册到 MBean Server 里的MBean。规范要求必须以 MBean 或者 MXBean 结尾的类,才被视为被托管的 Bean(Managed Bean),否则就不是。
实例
MBean Interface
public interface GameMBean {
public void playFootball(String clubName);
public String getPlayerName(); // getter
public void setPlayerName(String playerName); // setter
}
MBean 实现类
public class Game implements GameMBean {
private String playerName;
@Override
public void playFootball(String clubName) {
System.out.println(
this.playerName + " playing football for " + clubName);
}
@Override
public String getPlayerName() {
System.out.println("Return playerName " + this.playerName);
return playerName;
}
@Override
public void setPlayerName(String playerName) {
System.out.println("Set playerName to value " + playerName);
this.playerName = playerName;
}
}
测试
import javax.management.*;
import java.lang.management.ManagementFactory;
public class Main {
public static void main(String [] args){
try {
ObjectName objectName = new ObjectName("com.github.io.stardust:type=basic,name=game");
MBeanServer server = ManagementFactory.getPlatformMBeanServer(); // JMX agent layer
// 向 MBeanServer 注册这个 GameMBean
server.registerMBean(new Game(), objectName);
} catch (MalformedObjectNameException | InstanceAlreadyExistsException |
MBeanRegistrationException | NotCompliantMBeanException e) {
// handle exceptions
}
while (true) {
}
}
}
Jconsole 查看 MBean
- 运行 main。
- jps 查看 main 的进程 pid。
- 运行
jdk1.8.0_191\bin\jconsole.exe程序。 - jconsole 连接本地进程。

- jconsole 查看注册的 Game 这个 MBean

- 怎样通过 Game 这个 MBean
管理Java 程序呢?
可以在 Jconsole 中修改PlayerName这个属性的值。可以看到在GameMBean这个接口中定义的 getter 和 setter 来操作这个属性。修改后,点击刷新,控制台输出为:
Set playerName to value stardust
Return playerName stardust
Return playerName stardust

在 HikariDataSource 中的使用
/**
* Default constructor. Setters are used to configure the pool. Using
* this constructor vs. {@link #HikariDataSource(HikariConfig)} will
* result in {@link #getConnection()} performance that is slightly lower
* due to lazy initialization checks.
*
* The first call to {@link #getConnection()} starts the pool. Once the pool
* is started, the configuration is "sealed" and no further configuration
* changes are possible -- except via {@link HikariConfigMXBean} methods.
*/
public HikariDataSource()
{
super();
fastPathPool = null;
}
HikariDataSource 这个 JDBC 数据库连接池一旦启动后,想要修改数据库连接池的配置,只有通过 MBean 才可以修改。

本文介绍了Java Management Extensions (JMX) 的三层架构,并通过一个具体示例展示了如何使用JMX进行Java程序管理。此外,还特别介绍了在HikariDataSource数据库连接池中的MBean使用方法。
282





