长沙建站网站相城区网络营销公司

当前位置: 首页 > news >正文

长沙建站网站,相城区网络营销公司,百度指数的主要用户是,网络服务商怎么咨询JMX架构由三个主要组件构成#xff1a; ‌MBeans#xff08;Managed Beans#xff09;‌#xff1a;代表可管理的资源#xff0c;是JMX的核心。MBean可以是Java类或接口#xff0c;提供了管理操作的接口#xff0c;如获取系统信息、设置参数等。‌MBeanServer‌#x…        JMX架构由三个主要组件构成 ‌MBeansManaged Beans‌代表可管理的资源是JMX的核心。MBean可以是Java类或接口提供了管理操作的接口如获取系统信息、设置参数等。‌MBeanServer‌运行MBeans并处理管理操作的实体。每个Java虚拟机JVM都默认包含一个MBeanServer它可以注册和管理MBeans并提供了一组API来注册、查询、调用MBean的方法以及接收MBean的通知。‌代理Agents‌用于暴露MBeanServer给网络中的其他管理工具或系统。JMX代理是一个独立的Java程序负责加载和管理MBean。 MBean MBean 是JMX中的一个标准概念它代表了一个可以被管理的资源。MBean 必须遵循特定的接口规范比如它必须实现一个特定的接口或者继承自 javax.management.DynamicMBean。MBean 可以是标准的Standard MBean、动态的Dynamic MBean、开放式的Open MBean或者模型式的Model MBean。MBean 的方法名称和签名必须与它们公开的属性和操作完全匹配。 MBean 分类 JMX标准中将MBean分为以下几种 Standard MBean标准 MBean它是最简单的一种 MBean 类型。一个标准 MBean 由一个 Java 接口和一个对应的实现类组成。接口中定义了 MBean 的属性和操作实现类则提供了对应的实现。标准 MBean 的命名约定为 YourInterfaceNameMBean。Dynamic MBean动态 MBean与标准 MBean 不同动态 MBean 可以在运行时动态地确定其属性和操作。动态 MBean 的属性和操作是在运行时通过方法调用来确定的因此可以根据需要进行动态修改。 Model MBean模型 MBean模型 MBean 是一种特殊的 MBean它通过描述符来描述其管理接口可以在运行时动态地配置其属性和操作。模型 MBean 可以通过 XML 或者通过程序动态地加载描述符。 Open MBean开放 MBean 是一种通用的 MBean 类型它可以包含各种类型的属性和操作。开放 MBean 不限制其属性和操作的类型因此可以包含任意类型的数据。 MXBeanMXBean 是一种专门用于 JMX 的 MBean 类型。它定义了一种简单的 Java 接口和实现约定用于描述 MBean 的属性和操作同时这些接口和实现类遵循 Java Bean 的命名约定。MXBean 在 JMX 中用于管理特定类型的对象例如内存使用情况、线程信息等。 Standard MBean Standard MBean按照JMX的命名规范来定义接口然后注册到MBean Server中MBean就能被JMX的client端访问到。 public interface HelloMBean {String getName();void setName(String name);void sayHello(); }public class Hello implements HelloMBean {private String name; ​Overridepublic String getName() {return name;} ​Overridepublic void setName(String name) {this.name name;} ​Overridepublic void sayHello() {System.out.println(Hello, name !);} } ​public class Main {public static void main(String[] args) throws Exception {// 创建标准 MBean 实例HelloMBean helloMBean new Hello();// 创建 MBeanServerMBeanServer mbs ManagementFactory.getPlatformMBeanServer();// 创建 ObjectName用于标识 MBeanObjectName name new ObjectName(com.example:typeHello);// 注册 MBean 到 MBeanServermbs.registerMBean(helloMBean, name);// 等待一段时间使得可以通过 JConsole 或者其他 JMX 客户端来操作 MBeanThread.sleep(Long.MAX_VALUE);} }Spring boot 实现方式

  1. 引入依赖 !– Spring Boot Actuator 依赖它包含了 JMX 的支持 – dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId /dependency 2. yml 配置 spring:jmx:enabled: true 3. 注解实现Mbean 类 Component ManagedResource(objectName bean:namemyBeanTest, description My Managed Bean) public class MbeanTest {private String name;ManagedAttribute(description The Name)public String getName() {return name;}ManagedAttribute(description The Name)public void setName(String name) {this.name name;}ManagedOperation(description Say Hello)public String sayHello() {return Hello, name;} } Dynamic MBean 动态 MBean 的核心是实现 DynamicMBean 接口该接口定义了一组方法用于动态地获取和设置 MBean 的属性执行 MBean 的操作以及获取 MBean 的元数据信息。以下是 DynamicMBean 接口的几个核心方法 getAttribute(String attribute)根据属性名获取属性值。setAttribute(Attribute attribute)设置指定属性的值。getAttributes(String[] attributes)批量获取属性值。setAttributes(AttributeList attributes)批量设置属性值。invoke(String actionName, Object[] params, String[] signature)执行指定的操作。getMBeanInfo()获取 MBean 的元数据信息包括属性、操作和描述信息。 Component ManagedResource(objectName bean:nameDynamicMBeanTest, description My Dynamic Bean) public class DynamicMBeanTest implements DynamicMBean {private String name;Overridepublic Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {if (attribute.equals(Name)) {return name;} else {throw new AttributeNotFoundException(Attribute attribute not found);}}Overridepublic void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {if (attribute.getName().equals(Name)) {name (String) attribute.getValue();} else {throw new AttributeNotFoundException(Attribute attribute.getName() not found);}}Overridepublic AttributeList getAttributes(String[] attributes) {AttributeList attrs new AttributeList();for (String attr : attributes) {try {Object value getAttribute(attr);attrs.add(new Attribute(attr, value));} catch (Exception e) {// Ignore if attribute not found}}return attrs;}Overridepublic AttributeList setAttributes(AttributeList attributes) {AttributeList responseAttrs new AttributeList();for (Attribute attr : attributes.asList()) {try {setAttribute(attr);responseAttrs.add(new Attribute(attr.getName(), getAttribute(attr.getName())));} catch (Exception e) {// Ignore if attribute not found or set failed}}return responseAttrs;}Overridepublic Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException {if (actionName.equals(sayHello)) {return Hello, name !;} else {throw new UnsupportedOperationException(Operation actionName not supported);}}Overridepublic MBeanInfo getMBeanInfo() {MBeanAttributeInfo[] attributes new MBeanAttributeInfo[]{new MBeanAttributeInfo(Name, java.lang.String, Name of the person, true, true, false)};MBeanOperationInfo[] operations new MBeanOperationInfo[]{new MBeanOperationInfo(sayHello, Say hello to the person, null, java.lang.String, MBeanOperationInfo.ACTION)};return new MBeanInfo(this.getClass().getName(), Dynamic Hello MBean, attributes, null, operations, null);} } Model MBean Model MBean 的核心是实现 ModelMBean 接口该接口继承自 DynamicMBean 接口因此具有动态 MBean 的所有特性同时还添加了一些额外的方法用于管理描述符。 setModelMBeanInfo(ModelMBeanInfo mbi)设置 Model MBean 的元数据信息包括属性、操作和描述符。setManagedResource(Object mr, String mr_type)指定 Model MBean 管理的资源对象及其类型。 public class ModelMBeanTest {private static ModelMBeanInfo createModelMBeanInfo() throws Exception {// 创建属性描述符Descriptor nameDesc new DescriptorSupport();nameDesc.setField(name, Name);nameDesc.setField(descriptorType, attribute);// 创建操作描述符Descriptor sayHelloDesc new DescriptorSupport();sayHelloDesc.setField(name, sayHello);sayHelloDesc.setField(descriptorType, operation);// 创建属性列表ModelMBeanAttributeInfo[] attributes new ModelMBeanAttributeInfo[]{new ModelMBeanAttributeInfo(Name, java.lang.String, Name of the person, true, true, false, nameDesc)};// 创建操作列表ModelMBeanOperationInfo[] operations new ModelMBeanOperationInfo[]{new ModelMBeanOperationInfo(sayHello, Say hello to the person, null, java.lang.String, MBeanOperationInfo.ACTION, sayHelloDesc)};// 创建 ModelMBeanInfoModelMBeanInfo modelMBeanInfo new ModelMBeanInfoSupport(ModelMBeanTest.class.getName(),Simple Model MBean Example,attributes,null,operations,null);return modelMBeanInfo;}private static ModelMBean createModelMBean(ModelMBeanInfo modelMBeanInfo) throws Exception {// 创建 ModelMBean 实例RequiredModelMBean modelMBean new RequiredModelMBean();modelMBean.setModelMBeanInfo(modelMBeanInfo);// 创建 MBean 实例ObjectName name new ObjectName(com.example:typeSimpleModelMBean);ModelMBeanTest example new ModelMBeanTest();// 设置 MBean 实例modelMBean.setManagedResource(example, ObjectReference);return modelMBean;}public static void main(String[] args) throws Exception {// 创建 ModelMBeanInfo 对象ModelMBeanInfo modelMBeanInfo createModelMBeanInfo();// 创建 ModelMBean 实例ModelMBean modelMBean createModelMBean(modelMBeanInfo);// 创建 MBeanServerMBeanServer mbs ManagementFactory.getPlatformMBeanServer();// 创建 ObjectName用于标识 MBeanObjectName name new ObjectName(com.example:typeModelMBeanTest);// 注册 ModelMBean 到 MBeanServermbs.registerMBean(modelMBean, name);// 等待一段时间使得可以通过 JConsole 或者其他 JMX 客户端来操作 MBeanThread.sleep(Long.MAX_VALUE);}} Open MBean 与传统的 Standard MBean 和 Dynamic MBean 不同Open MBean 不需要预先定义接口而是使用开放式的数据类型和操作来描述 MBean 的管理接口使得可以更灵活地适应各种场景和需求。 Component public class SimpleOpenMBean extends NotificationBroadcasterSupport {// Constructorpublic SimpleOpenMBean() {super();openMBean();}// The actual value of the SimpleProperty attributeprivate int simpleProperty 0;// Operation to reset the SimplePropertypublic void reset() {simpleProperty 0;}public MBeanInfo openMBean() {OpenMBeanAttributeInfoSupport simplePropertyInfo new OpenMBeanAttributeInfoSupport(SimpleProperty,The SimpleProperty of the SimpleOpenMBean,SimpleType.INTEGER,true, // isReadabletrue, // isWritablefalse); // isIsOpenMBeanConstructorInfoSupport constructorInfo new OpenMBeanConstructorInfoSupport(SimpleOpenMBean,Constructs a SimpleOpenMBean instance,new OpenMBeanParameterInfoSupport[]{});OpenMBeanOperationInfoSupport resetOperationInfo new OpenMBeanOperationInfoSupport(reset,Resets the SimpleProperty to 0,new OpenMBeanParameterInfoSupport[]{},SimpleType.VOID,MBeanOperationInfo.ACTION);return new OpenMBeanInfoSupport(SimpleOpenMBean.class.getName(),SimpleOpenMBean Description,new OpenMBeanAttributeInfo[]{simplePropertyInfo},new OpenMBeanConstructorInfo[]{constructorInfo},new OpenMBeanOperationInfo[]{resetOperationInfo},new MBeanNotificationInfo[0]);}} MXBean    在 Java 中一切都被视为对象而 JMX 则提供了一种标准化的方式来监控和管理 Java 程序的运行时状态、性能指标以及运行环境。而MXBean就是专门用于管理和监控这其中一些标准化类型的对象的例如内存使用情况、线程信息、操作系统属性等。这些MBean是拿来即用的。 平台MXBean 平台MXBean是 Java SE 平台提供的一组 MXBean用于监视和管理 Java VM 以及 Java 运行时环境 (JRE) 的其他组件。每个平台 MXBean 都封装了一部分 Java VM 功能例如类加载系统、即时 (JIT) 编译系统、垃圾收集器等。可以使用符合 JMX 规范的监视和管理工具显示这些 MXBean 并与之交互以便您监视和管理这些不同的 VM 功能。Java SE 平台的 JConsole 图形用户界面 (GUI) 就是这样一种监视和管理工具。Java SE 平台提供了一个标准平台 MBean 服务器这些平台 MXBean 都注册在该服务器中。平台 MBean 服务器还可以注册您希望创建的任何其他 MBean。 public class XMBeanTest {public static void main(String[] args) {// 获取内存管理MXBean用于监控和管理Java虚拟机的内存系统MemoryMXBean memoryMXBean ManagementFactory.getMemoryMXBean();// 获取线程系统MXBean用于监控和管理Java虚拟机的线程系统ThreadMXBean threadMXBean ManagementFactory.getThreadMXBean();// 获取运行时系统MXBean用于获取Java虚拟机的运行时信息RuntimeMXBean runtimeMXBean ManagementFactory.getRuntimeMXBean();// 获取操作系统MXBean用于获取操作系统的相关信息OperatingSystemMXBean operatingSystemMXBean ManagementFactory.getOperatingSystemMXBean();// 获取编译系统MXBean用于获取Java虚拟机的即时编译器信息CompilationMXBean compilationMXBean ManagementFactory.getCompilationMXBean();// 获取Java虚拟机堆内存的使用情况MemoryUsage heapMemoryUsage memoryMXBean.getHeapMemoryUsage();// 获取Java虚拟机非堆内存的使用情况MemoryUsage nonHeapMemoryUsage memoryMXBean.getNonHeapMemoryUsage();// 获取类加载系统的MXBean用于监控和管理Java虚拟机的类加载系统ClassLoadingMXBean classLoadingMXBean ManagementFactory.getClassLoadingMXBean();// 获取所有内存池的MXBean列表用于监控和管理Java虚拟机的内存池ListMemoryPoolMXBean memoryPoolMXBeans ManagementFactory.getMemoryPoolMXBeans();// 获取所有内存管理器的MXBean列表用于监控和管理Java虚拟机的内存管理器ListMemoryManagerMXBean memoryManagerMXBeans ManagementFactory.getMemoryManagerMXBeans();// 获取所有垃圾收集器的MXBean列表用于监控和管理Java虚拟机的垃圾收集器ListGarbageCollectorMXBean garbageCollectorMXBeans ManagementFactory.getGarbageCollectorMXBeans();System.out.println(Heap Memory Usage:);System.out.println( Init: heapMemoryUsage.getInit() / (1024 * 1024) MB);System.out.println( Used: heapMemoryUsage.getUsed() / (1024 * 1024) MB);System.out.println( Committed: heapMemoryUsage.getCommitted() / (1024 * 1024) MB);System.out.println( Max: heapMemoryUsage.getMax() / (1024 * 1024) MB);System.out.println(Non-Heap Memory Usage:);System.out.println( Init: nonHeapMemoryUsage.getInit() / (1024 * 1024) MB);System.out.println( Used: nonHeapMemoryUsage.getUsed() / (1024 * 1024) MB);System.out.println( Committed: nonHeapMemoryUsage.getCommitted() / (1024 * 1024) MB);System.out.println( Max: nonHeapMemoryUsage.getMax() / (1024 * 1024) MB);} } MBeanServer MBeanServer 是一个Java对象它充当JMX代理的核心。它提供了一个注册和管理MBeans的环境。MBeans是遵循特定约定的Java对象它们暴露了可以被管理的资源或服务。 MBeanServer作用 注册和管理MBeansMBeanServer 允许你注册MBeans并通过ObjectName来引用它们。每个MBean都有一个唯一的ObjectName它是MBeanServer用来识别和管理MBean的关键。提供访问接口MBeanServer 提供了方法来访问MBeans的属性、调用操作、注册和接收通知。实现远程管理通过连接器如JMXMP或JMXRMIMBeanServer 支持远程客户端的连接从而允许远程管理和监控。支持多种协议MBeanServer 可以通过不同的协议如RMI、JMS、HTTP等暴露MBeans。 MBeanServer关键特性 MBean注册通过调用createMBean或registerMBean方法可以将MBean注册到MBeanServer中。MBean操作可以调用invoke方法来执行MBean的操作。属性访问可以通过getAttribute和setAttribute方法来读取和修改MBean的属性。事件和通知MBeanServer 支持事件和通知机制允许MBeans在特定事件发生时发送通知。代理和委托MBeanServer 可以作为其他MBeanServer的代理或委托实现更复杂的管理结构。 MBeanServer创建 在Java应用程序中通常使用以下方式来创建MBeanServer MBeanServer mBeanServer MBeanServerFactory.createMBeanServer(); 如果使用JMX的javax.management.MBeanServerFactory类 MBeanServer mBeanServer ManagementFactory.getPlatformMBeanServer(); ManagementFactory.getPlatformMBeanServer() 方法返回的MBeanServer 是Java虚拟机启动时创建的平台MBeanServer。 MBeanServer使用 以下是一些使用MBeanServer的基本步骤 创建或获取MBeanServer实例。创建MBean实例。通过ObjectName注册MBean到MBeanServer。使用MBeanServer的方法来访问MBean的属性、调用操作或接收通知。 // 创建MBeanServer MBeanServer mBeanServer ManagementFactory.getPlatformMBeanServer();// 创建ObjectName ObjectName name new ObjectName(com.example:typeMyMBean);// 创建MBean实例 MyMBean mbean new MyMBeanImpl();// 注册MBean mBeanServer.registerMBean(mbean, name);// 调用MBean操作 mBeanServer.invoke(name, myOperation, new Object[]{}, new String[]{});// 读取MBean属性 Integer value (Integer) mBeanServer.getAttribute(name, MyAttribute); JMX Agent JMX Agent是指一个运行在Java虚拟机JVM中的管理实体它负责管理一个或多个MBeansManaged Beans并提供与外部管理应用程序如JMX客户端的通信接口。 JMX Agent的组成 一个JMX agent 通常包含以下几个主要组件 MBeanServeragent 的核心组件负责注册和管理MBeans并提供对MBeans的操作、属性访问和通知的接口。 MBeans实现具体管理功能的Java对象它们可以是标准MBeans、动态MBeans、开放MBeans或模型MBeans。 JMX Connector允许远程管理应用程序通过特定的协议如RMI、JMXMP、IIOP、HTTP等连接到agent。 Service MBean提供agent级别的服务如安全管理、事件处理、监控服务等。 Adaptor将agent中的MBeans暴露给不同的管理协议例如将MBeans通过JMX RMI连接器暴露给远程客户端。
    JMX Agent的功能 本地和远程管理agent 支持本地和远程管理使得管理员可以通过本地或远程JMX客户端对Java应用程序进行监控和管理。服务封装agent 可以将Java应用程序中的服务封装成MBeans从而便于管理。安全管理agent 可以实现访问控制确保只有授权的管理员可以访问或修改MBeans。事件和通知agent 支持事件和通知机制允许MBeans在特定事件发生时发送通知给感兴趣的监听者。 JMX Agent的生命周期 启动当Java应用程序启动时JMX agent 也会启动并创建MBeanServer。运行在运行期间agent 管理MBeans处理来自JMX客户端的请求发送和接收通知。关闭当Java应用程序关闭时agent 会进行清理工作如注销MBeans关闭连接器等。 JMX Agent创建 创建一个简单的JMX agent 通常涉及以下步骤 创建MBeanServer实例。创建并注册MBeans到MBeanServer。创建JMX连接器以便远程访问。启动连接器使agent 可以接受远程连接。 import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.ObjectName; import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXConnectorServerFactory; import javax.management.remote.JMXServiceURL;public class JMXAgent {public static void main(String[] args) throws Exception {// 创建MBeanServerMBeanServer mBeanServer MBeanServerFactory.createMBeanServer();// 创建ObjectNameObjectName name new ObjectName(com.example:typeMyMBean);// 创建并注册MBeanMyMBean mbean new MyMBeanImpl();mBeanServer.registerMBean(mbean, name);// 创建JMX服务URLJMXServiceURL url new JMXServiceURL(service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi);// 创建JMXConnectorServerJMXConnectorServer connectorServer JMXConnectorServerFactory.newJMXConnectorServer(url, null, mBeanServer);// 启动连接器connectorServer.start();// 打印连接信息System.out.println(JMX Agent is running at: url);} } 参考文献 官方文档 : https://docs.oracle.com/javase/tutorial/jmx/overview/index.html 【JMX】JAVA监控的基石-CSDN博客JMX使用详解-CSDN博客