Java中的JMX的使用

news2024/9/22 19:44:58

文章目录

        • 1. 定义和存在的意义
        • 2. 架构
          • 2.1 Instrumentation
          • 2.2 JMX Agent
          • 2.3 Remote Management
        • 3. 启动和连接
          • 3.1 注册MBean
          • 3.2 有两个方式启动JMX Agent
          • 3.3 Remote Management(客户端)
        • 4. MBeanServerConnection使用
          • 4.1 列出所有的MBean
          • 4.2 列出所有的Domain
          • 4.3 MBean计数
          • 4.4 获取和设置属性
          • 4.5 调用方法
          • 4.6 获取MBeanInfo

1. 定义和存在的意义

JMX是Java Management Extention的缩写,本质的出发点是让外部能获取、设置应用的信息及操作。如果是Web应用可以通过HTTP接口暴露,如果RPC应用可以通过RPC调用暴露,但是不通用。JMX就是为这类管理接口提供一个统一的访问方式。

2. 架构

JMX在架构上分为3层:

  • Instrumentation
  • JMX agent
  • Remote management
2.1 Instrumentation

Instrumentation提供了MBean创建的规范,JDK自带了一组叫做MXBean的特殊MBean,对外暴露了一些JVM信息及操作。

2.2 JMX Agent

JMX Agent用来管理Instrument, JMX Agent的核心是MBeanServer(用来注册MBean),并至少提供一组adaptor和connector(可以理解为通信协议和通信方式,允许外部程序或者客户端和JMX Agent通信)

2.3 Remote Management

可以理解为JMX Agent的客户端,通过不同的adapter和connect(协议和通信方式)连接到JMX Agent。

3. 启动和连接
3.1 注册MBean
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
String domain = "MyMBean";
// 注册hello
ObjectName helloName = new ObjectName(domain + ":name=hello");
server.registerMBean(new Hello(),helloName);
3.2 有两个方式启动JMX Agent
  • 使用JVM参数
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=1099 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false
  • 使用Java代码
String domain = "jmxrmi"
int rmiPort = 1099;
Registry registry = LocateRegistry.createRegistry(rmiPort);
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + domain);
JMXConnectorServer jmxConnector = JMXConnectorServerFactory.newJMXConnectorServer(url,null,server);
jmxConnector.start();

如果是代码或者是远程连接JMX Agent,后续会用到JMXServiceURL的地址。和使用Java代码创建不同,JVM参数的domain值固定为jmxrmi

3.3 Remote Management(客户端)

客户端的方式也有很多,这里介绍两种

  • JConsole 有两种选项,本地进程,可以选择进程ID连接,远程进程要使用JMXServiceURL里的地址

    在这里插入图片描述

  • Java代码

String domain = "jmxrmi";
int rmiPort = 1099;
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:" + rmiPort + "/" + domain);
JMXConnector jmxc = JMXConnectorFactory.connect(url);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
4. MBeanServerConnection使用
4.1 列出所有的MBean
Set<ObjectInstance> ins = mbsc.queryMBeans(null,null);
for(ObjectInstance i : ins) {
    System.out.println("object: " + i.getObjectName());
}
4.2 列出所有的Domain
String[] domains = mbsc.getDomains();
for (String d : domains) {
    System.out.println(d);
}
4.3 MBean计数
System.out.println("MBeanCount:" + mbsc.getMBeanCount());
4.4 获取和设置属性
String domain = "MyMBean";
ObjectName helloName = new ObjectName(domain + ":name=hello");
System.out.println("getAttribute:--->" + mbsc.getAttribute(helloName, "Slogan")); // 获取
mbsc.setAttribute(helloName, new Attribute("Slogan", "" + System.nanoTime())); // 设置
System.out.println("getAttribute after modified--->" + mbsc.getAttribute(helloName, "Slogan")); // 获取
4.5 调用方法

有两种方式

  • 使用MBeanServerConnection
String domain = "MyMBean";
ObjectName helloName = new ObjectName(domain + ":name=hello");

mbsc.invoke(helloName, "printHello", new String[]{"shit"}, new String[]{String.class.getName()}); // 没有返回值
Object resp = mbsc.invoke(helloName, "daydream", new Integer[]{5000}, new String[]{Integer.class.getName()}); // 返回值
System.out.println("daydream:--->" + resp);
  • 使用MBeanServerInvocationHandler生成代理类
String domain = "MyMBean";
ObjectName helloName = new ObjectName(domain + ":name=hello");

HelloMBean proxy = MBeanServerInvocationHandler.newProxyInstance(mbsc,helloName,HelloMBean.class,false);
System.out.println("proxy get attribute:" + proxy.getSlogan());
System.out.println("proxy invoke:" + proxy.daydream(9999));
4.6 获取MBeanInfo
String domain = "MyMBean";
ObjectName helloName = new ObjectName(domain + ":name=hello");

MBeanInfo beanInfo = mbsc.getMBeanInfo(helloName);
System.out.println("class name:" + beanInfo.getClassName()); // MBean实现类

MBeanAttributeInfo[] attrinfos = beanInfo.getAttributes();  // MBean的属性
for(MBeanAttributeInfo a: attrinfos) {
    System.out.println("attribute name:" + a.getName());
}

MBeanOperationInfo[] operationInfos = beanInfo.getOperations(); // MBean上的操作
for(MBeanOperationInfo o: operationInfos) {
    System.out.println("operation name:" + o.getName());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1272900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python (十六) 错误和异常

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

【Linux】基础IO--文件基础知识/文件操作/文件描述符

文章目录 一、文件相关基础知识二、文件操作1.C语言文件操作2.操作系统文件操作2.1 比特位传递选项2.2 文件相关系统调用2.3 文件操作接口的使用 三、文件描述符fd1.什么是文件描述符2.文件描述符的分配规则 一、文件相关基础知识 我们对文件有如下的认识&#xff1a; 1.文件 …

C 语言-数组

1. 数组 1.1 引入 需求&#xff1a;记录班级10个学员的成绩 需要定义10个变量存在的问题:变量名起名困难变量管理困难需求&#xff1a;记录班级1000个学员的成绩 1.2 概念 作用&#xff1a;容纳 数据类型相同 的多个数据的容器 。 特点&#xff1a; 长度不可变容纳 数据类型…

python实现two way ANOVA

文章目录 目的&#xff1a;用python实现two way ANOVA 双因素方差分析1. python代码实现1 加载python库2 加载数据3 统计样本重复次数&#xff0c;均值和方差&#xff0c;绘制箱线图4 查看people和group是否存在交互效应5 模型拟合与Two Way ANOVA&#xff1a;双因素方差分析6 …

ELFK集群部署(Filebeat+ELK) 本地收集nginx日志 远程收集多个日志

filebeat是一款轻量级的日志收集工具&#xff0c;可以在非JAVA环境下运行。 因此&#xff0c;filebeat常被用在非JAVAf的服务器上用于替代Logstash&#xff0c;收集日志信息。 实际上&#xff0c;Filebeat几乎可以起到与Logstash相同的作用&#xff0c; 可以将数据转发到Logst…

融资经理简历模板

这份简历内容&#xff0c;以综合柜员招聘需求为背景&#xff0c;我们制作了1份全面、专业且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴。 融资经理简历在线编辑下载&#xff1a;百度幻主简历 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;融资经理 …

Python Pyvis库:可视化复杂网络结构的利器

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python Pyvis库&#xff1a;可视化复杂网络结构的利器&#xff0c;全文4000字&#xff0c;阅读大约12钟。 在数据科学和网络分析领域&#xff0c;理解和可视化复杂网络结构是…

JeecgBoot低代码开发—Vue3版前端入门教程

JeecgBoot低代码开发—Vue3版前端入门教程 后端接口配置VUE3 必备知识1.vue3新特性a. https://v3.cn.vuejs.org/b.setup的用法c.ref 和 reactive 的用法d.新版 v-model 的用法e.script setup的用法 2.TypeScript基础 后端接口配置 如何修改后台项目路径 http://127.168.3.52:8…

Ubuntu systemd-analyze命令(系统启动性能分析工具:分析系统启动时间,找出可能导致启动缓慢的原因)

文章目录 Ubuntu systemd-analyze命令剖析目录简介systemd与systemd-analyze工作原理 安装和使用命令参数详解用例与示例显示启动时间&#xff08;systemd-analyze time&#xff09;列出启动过程中各个服务的启动时间&#xff08;systemd-analyze blame&#xff09;显示系统启动…

R语言单因素方差分析+差异显著字母法标注+逐行详细解释

R语言单因素方差分析 代码如下 df <- read.csv("data.csv",header TRUE,row.names 1) library(reshape2) df <- melt(df,idc()) names(df) <- c(trt, val) df aov1 <- aov(val~trt,datadf) summary(aov1)library(agricolae) data <- LSD.test(aov…

windows远程桌面登录,提示:“出现身份验证错误,要求的函数不受支持”

问题&#xff1a; windows登录远程桌面&#xff0c;提示&#xff1a;“出现身份验证错误&#xff0c;要求的函数不受支持”&#xff0c;如下图&#xff1a; 问题原因&#xff1a; windows系统更新&#xff0c;微软系统补丁的更新将 CredSSP 身份验证协议的默认设置进行了调…

【腾讯云云上实验室-向量数据库】个人对腾讯云向量数据库的体验心得

目录 前言Tencent Cloud VectorDB概念使用初体验腾讯云向量数据库的优势应用场景有哪些&#xff1f;未来展望番外篇&#xff1a;腾讯云向量数据库的设计核心结语 前言 还是那句话&#xff0c;不用多说想必大家都能猜到&#xff0c;现在技术圈最火的是什么&#xff1f;非人工智…

ZZULIOJ 2466: 楼上瞎说,楼下才是,Java

2466: 楼上瞎说&#xff0c;楼下才是 题目描述 《九章算术》的内容十分丰富&#xff0c;全书采用问题集的形式&#xff0c;收有246个与生产、生活实践有联系的应用问题&#xff0c;其中每道题有问&#xff08;题目&#xff09;、答&#xff08;答案&#xff09;、术&#xff…

【Vulnhub 靶场】【DriftingBlues: 9 (final)】【简单】【20210509】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/driftingblues-9-final,695/ 靶场下载&#xff1a;https://download.vulnhub.com/driftingblues/driftingblues9.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年05月09日 文件大小&#xff1a;738 …

编程之外,生活的美好航程

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

涵盖多种功能,龙讯旷腾Module第二期:电子结构及声子计算

Module是什么 在PWmat的基础功能上&#xff0c;我们针对用户的使用需求开发了一些顶层模块&#xff08;Module&#xff09;。这些Module中的一部分是与已有的优秀工具的接口&#xff0c;一部分是以PWmat的计算结果为基础得到实际需要的物理量&#xff0c;一部分则是为特定的计…

Jmeter接口测试:jmeter_HTTP Cookie管理器看这一篇文章就够了

HTTP Cookie管理器 HTTP Cookie管理器可以像浏览器一样自动存储和发送cookie&#xff0c;以这种自 动收集的方式收集到的cookie不会在cookie manager中进行展示&#xff0c;但是运行后&#xff0c; 可以通过 查看结果树&#xff08;监听器&#xff09;可以查看到cookie信息 除…

WPF实战项目十九(客户端):修改RestSharp的引用

修改HttpRestClient&#xff0c;更新RestSharp到110.2.0&#xff0c;因为106版本和110版本的代码不一样&#xff0c;所以需要修改下代码 using Newtonsoft.Json; using RestSharp; using System; using System.Threading.Tasks; using WPFProjectShared;namespace WPFProject.S…

中国毫米波雷达产业分析4——毫米波雷达企业介绍

一、矽典微 &#xff08;一&#xff09;公司简介 矽典微致力于实现射频技术的智能化&#xff0c;专注于研发高性能无线技术相关芯片&#xff0c;产品广泛适用于毫米波传感器、下一代移动通信、卫星通信等无线领域。 整合自身在芯片、系统、软件、算法等领域的专业能力&#xf…

【驱动】SPI驱动分析(四)-关键API解析

关键API 设备树 设备树解析 我们以Firefly 的SPI demo 分析下dts中对spi的描述&#xff1a; /* Firefly SPI demo */ &spi1 {spi_demo: spi-demo00{status "okay";compatible "firefly,rk3399-spi";reg <0x00>;spi-max-frequency <48…