在第一部分中,我们对JMX及其远程管理层进行了讨论。在这一中,我们将了解其第二层是代理层。
代理概述
JMX代理是直接控制资源的标准管理代理。它使它们可用于远程管理应用程序。 JMX代理通常位于与控制资源的同一系统上,但这不是必需。
JMX代理是在JVM中运行并充当托管豆(MBEANS)和管理应用程序之间的联络的管理实体。 JMX代理的各个组件在以下各节中概述:
- mbean服务器
- 代理服务
- 协议适配器和连接器
服务器MRS:
mbean服务器又名MBEAN代理是JMX代理的核心组件。这是JMX代理中对象进行管理操作的注册表。在管理应用程序中可以看到一个注册MBEAN服务器的对象。 MBEAN服务器仅公开MBEAN的管理接口。
您想从代理JVM外部管理的任何资源都必须在服务器上注册为MBEAN。 MBEAN服务器提供了一个标准化的接口,用于访问同一JVM中的MBEAN。从而为当地对象赋予操纵可管理资源的所有好处。可以通过以下方式实例化和注册MBEANS:
- 另一个mbean
- 代理本身
- 远程管理应用程序
注册MBEAN时,必须为其分配一个唯一的对象名称。管理应用程序使用对象名称来识别其执行管理操作的对象。 MBEAN上可用的操作包括:
- 发现mbeans的管理接口
- 阅读和写下其属性值
- 执行由MBEANS定义的操作
- 获得MBEANS发出的通知
- 通过使用其对象名称或其属性值来查询mbeans
- 建筑
- 什么是mbean
- mbean服务器
女士
mbeans是托管的豆类,代表要管理的资源的Java对象。 mbeans可以是标准的或动态的。标准mbeans是符合从Javabeans组件模型的设计模式的Java对象。动态MBEANS在运行时定义其管理接口。
有两种类型的MBeans
- 标准mbean
- 动态mbean
标准MBEAN通过其属性和操作直接公开要管理的资源。属性通过“ getter”和“ setter”方法暴露。操作是经理可以使用的类的其他方法。所有这些方法在MBEAN界面上静态定义,并通过内省可见。这是使新资源可管理的最直接方法。
动态MBEAN是一个MBEAN,在运行时定义其管理接口。例如,MBEAN配置可以通过解析XML文件来确定其属性的名称和类型。
JMX代理是在JVM中运行并充当托管豆(MBEANS)和管理应用程序之间的联络的管理实体。 JMX代理的各个组件在以下各节中概述:
- mbean服务器
- 代理服务
- 协议适配器和连接器
服务器女人
MBEAN服务器是JMX代理的核心组件。它是JMX代理中对象的注册表,该注册表暴露于管理操作。在管理应用程序中可见在MBEAN服务器上注册的对象。 MBEAN服务器仅公开MBEAN的管理接口,从来没有直接对象参考。
您想从代理JVM外部管理的任何资源都必须在服务器上注册为MBEAN。 MBEAN服务器提供了一个标准化的接口,用于访问同一JVM中的MBEAN,从而为当地对象提供了操纵可管理资源的所有好处。可以通过以下方式实例化和注册MBEANS:
- 另一个mbean
- 代理本身
- 远程管理应用程序
当您注册mbean时,you must assign it a unique object name
。管理应用程序使用对象名称来识别其执行管理操作的对象。 MBEAN上可用的操作包括:
- 发现mbeans的管理接口
- 阅读和写下其属性值
- 执行由MBEANS定义的操作
- 获得MBEANS发出的通知
- 通过使用其对象名称或其属性值来查询mbeans
代理服务
代理服务是可以对MBEAN服务器注册的MBEAN进行管理操作的对象。代理服务也可以由MBEAN提供,允许它们及其功能通过MBEAN服务器控制。 Java管理扩展(JMX)规范,版本1.4定义以下代理服务:
- 动态类加载程序:通过管理服务获取动态类加载并实例化新类和本机库。从网络中动态下载的。
- 监视器:监视MBEAN属性的数值或字符串值。他们可以通知其他几种更改的其他对象。
计时器:计时器提供调度机制,可以以预定的间隔发送通知。
关系服务:关系服务使MBEAN可以相互交流。
协议适配器和连接器
协议适配器和连接器使代理可以从远程管理应用程序访问。他们通过MBEANS的特定协议提供了视图,这些协议已实例化并在MBEAN服务器上注册。他们使JVM之外的管理应用程序能够:
获取或设置现有mbeans的属性
对现有MBEANS进行操作
实例化和注册新的mbeans
注册并接收MBEANS发出的通知
平台mbeans
平台MBEAN(也称为MXBEAN)是用于监视和管理Java虚拟机(JVM)的MBEAN。每个MXBEAN都封装了JVM功能的一部分,例如JVM的类加载系统,JIT编译系统,垃圾收集器等。 Java.lang.Management软件包定义了平台MXBEANS。
表1列出了所有平台MBEAN及其管理的VM的方面。每个平台MXBEAN都有一个唯一的Javax.Management.ObjectName,用于在平台MBEANSERVER中注册。根据表中所示,JVM可能具有零,一个或一个以上的实例,具体取决于其功能。
。平台mbeans
接口 | 管理 | 对象名称 | 每个VM | 实例
---|---|---|---|
classloadingmxbean | 类加载系统 | java.lang:type = classloading | 一个 |
compilationmxbean | 编译系统 | java.lang:type = compilation | 零或一个 |
garbagecollectormxbean | 垃圾收集器 | java.lang:type = garbageCollector name = collectorName | 一个或多个 |
MemoryManagerMxBean(GarbageCollectormxBean的子接口) | 内存池 | java.lang:type = memoryManager name = ManagerName | 一个或多个 |
MemoryPoolMxBean | 内存 | java.lang:type = memorypool name = poolname | 一个或多个 |
memorymxbean | 内存系统 | java.lang:type =内存 | 一个 |
peratatingsystemmxbean | 基础操作系统 | java.lang:type = pertatingingsystem | 一个 |
runtimemxbean | 运行时系统 | java.lang:type = runtime | 一个 |
threadmxbean | 线程系统 | java.lang:type =螺纹 | 一个 |
平台豆服务器
平台MBEAN服务器可以通过在同一Java虚拟机中运行的不同托管组件共享。您可以使用Method ManagementFactory.getPlatformMbeanServer()访问平台MBEAN服务器。对此方法的第一个调用是创建平台MBEANSERVER,并使用其唯一的对象名称对平台MXBEAN进行注册。随后,它返回最初创建的平台mbeanserver。
MXBEAN会动态创建和破坏,例如,内存池和管理人员将自动注册并将其放置到平台MBEANSERVER中。如果设置了系统属性javax.management.builder.initial
,则将由指定的MBEANSERVERBUILDER完成平台MBEANSERVER创建。
使用平台MBEANSERVER在平台MXBEAN之外注册其他MBEAN。这使所有mbeans都可以通过同一MBEANSERVER发布,并使网络发布和发现更加容易。
现在,在此Java代码中,我们创建一个MBEAN,并在VisualVM中看到它
在步骤1
中让我们创建一个SystemStatusMBean
来获取一些相关的信息
public interface SystemStatusMBean {
Long getuptime();
}
这通过使用依赖注入来告诉MBEANSSERVER,该对象将导出1个指标:
- 正常时间
让我们写下实现此行为的实际对象:
public class SystemStatus implements SystemStatusMBean {
private Long uptime;
private Thread backgroundThread;
public SystemStatus() {
// First we initialize all the metrics
this.backgroundThread = new Thread();
this.uptime = 0;
// We will use a background thread to update the metrics
this.backgroundThread = new Thread(() -> {
try {
while (true) {
// Every second we update the metrics
uptime += 1;
Thread.sleep(1000L);
}
} catch (Exception e) {
e.printStackTrace();
}
});
this.backgroundThread.setName("backgroundThread");
this.backgroundThread.start();
}
// Through this getters, defined in the interface SystemStatusMBean,
// all the metrics will be automatically retrieved
@Override
public Long getUptime() {
return uptime;
}
}
从上一个代码中,您可以看到您只是创建一个从接口中实现所有指标的对象,并将每秒使用背景线程每秒更新它们。
最后,我们创建了mbean对象的实例,然后在mbeanserver中注册:
import javax.management.*;
import java.lang.management.ManagementFactory;
public class Day62 {
public static void main(String[] args) {
try {
// Initialize the object
SystemStatus systemStatus = new SystemStatus();
// Register the object in the MBeanServer
MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("com.simple.app:name=SystemStatus");
platformMBeanServer.registerMBean(systemStatus, objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
}
mbean需要一个ObjectName
来在mbeanserver中识别它。该名称必须包含一个domain
,以避免碰撞和钥匙。在此示例中,域将是com.simple.app
,关键将是name=SystemStatus
。
现在让我们从VisualVM看MBEAN
运行程序后,它将以while(true)
的形式在后台运行线程
我已经在Intellij scratch中运行了此程序,因此VisualVM正在将其注册。现在,如果我单击MBEAN菜单,我将看到
之类的东西我们可以在PlafromMBean
注册中看到的com.simple.app
。扩展后,我们将看到对象的名称是SystemStatus
打开SystemStatus后,我们可以看到为获取程序的正常运行时间定义的uptime
。该指标将根据程序进行更新。因此,如果我们按refresh
,那么我们可以看到正常运行时间指标的更新值。
这里的正常运行时间指标从14秒更改为61秒。因此,我们可以使用MBEANS定义指标并获取信息。