实践平台
- 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 才可以修改。