理解JMX之介绍和简单使用
从Jconsole的视图标签中见到,JConsole通过JMX展示的信息都是Java程序的通用信息,如内存情况、线程情况、类加载情况等,换言之,只要是Java程序就都具备这些信息。这些信息为我们优化程序性能、排查BUG非常有用,而JMX就是获取这些信息的基础,因此它是一种非常有用的技术。
然而JMX的强大远不止此,它出了能提供一些通用的信息以外,还能通过特定的编程接口提供一些针对具体程序的专有信息并在JConsole等JMX客户端工具中展示,具体点说就是程序员可以把需要展示的信息放在一种叫做MBean的Java对象内,然后JConsole之类的客户端工具可以连接到JMX服务,识别MBean并在图形界面中显示。从纯抽象的角度触发,这其实有点像浏览器发送一个请求给http服务器,然后http服务器执行浏览器的请求并返回相应的数据,从某种角度来说JConsole和JMX也是以这种方式工作的,只是它们使用的协议不是http,交换数据协议格式不是http数据包,但是他们的确是以客户端/服务器这种模式工作的,而且完成的事情也差不多。
那么既然有了http,JMX又有何存在意义呢。 事实上,JMX能完成的任务通过http的确都能完成,只不过某些情况下用JMX来做会更加方便。
比如说你需要知道服务器上个运行中程序的相关信息, 如执行了多少次数据库操作、任务队列中有多少个任务在等待处理
最常用的解决方案,我们会在程序中启动一个http服务,当接收到来自客户端的请求这些信息的请求时,我们的http处理程序会获得这些信息,并转换成特定格式的数据如JSON返回给客户端,客户端会以某种方式展现这些信息。
如以JMX作为解决方案,核心流程也是如此,但在数据的交换方式上会略有不同。
下面我们展示JMX是如何完成此任务的。
一、定义一个展示所需信息的MBean接口
public interface ServerInfoMBean {
int getExecutedSqlCmdCount();
}
在使用 Standard Mbean 作为数据传输对象的情况下这个接口的定义是必须的, 并且接口名称必须以“MBean”这个单词结尾。
二、实现具体的MBean
public class ServerInfo implements ServerInfoMBean {
public int getExecutedSqlCmdCount() {
return Dbutil.getExecutedSqlCmdCount();
}
}
三、在程序的某个地方启动JMX服务并注册ServerInfoMBean
public static void main(String[] args) throws JMException, Exception{
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("serverInfoMBean:name=serverInfo");
server.registerMBean(new ServerInfo(), name);
}
四、运行程序,并通过JConsole查看
如果程序运行在本地,Jconsole会自动检测到程序的进程,鼠标双击进入即可

在JConsole下面即会展示我们定义的MBean中的内容

那么假如Java程序并非运行在本地而是运行在远端服务器上我们应该如何通过客户端去连接呢, 很简单,只要使用JDK提供的JMX类库监听端口提供服务即可
public class Main {
public static void main(String[] args) throws JMException, Exception{
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("serverInfoMBean:name=serverInfo");
server.registerMBean(new ServerInfo(), name);
LocateRegistry.createRegistry(8081);
JMXServiceURL url = new JMXServiceURL
("service:jmx:rmi:///jndi/rmi://localhost:8081/jmxrmi");
JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
jcs.start();
}
}
或者在启动Java程序指定命令行参数也
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.port=10086
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
然后使用JConsole的连接远端进程功能即可

其余的操作和本地无差。
这相对于提供一个http服务来完成任务是不是要简单了不少,http是一个更加抽象、应用面更广泛、功能更强大的服务,因此所作的工作也要更多一些。JMX则是一个更加具体、应用面不那么广、功能也没有http强大的服务,不过呢它胜在解决特定问题更加轻松方便,上面的示例已经很好的说明了。
此外,JMX和Jconsole并不仅仅只能展示数据,它还能执行Java方法。以上面的示例为基础我们再进行一系列改进。
一、扩展ServerInfoMBean接口和实现的类
public interface ServerInfoMBean {
int getExecutedSqlCmdCount();
void printString(String fromJConsole);
}
public class ServerInfo implements ServerInfoMBean {
public int getExecutedSqlCmdCount() {
return 100;
}
public void printString(String fromJConsole) {
System.out.println(fromJConsole);
}
}
二、运行程序并使用JConsole连接

mbean页签中出现了我们新添加的方法
三、点击printString按钮调用方法

方法被调用,同时控制台也打印了通过Jconsole传递的参数
理解JMX之介绍和简单使用的更多相关文章
- 【转】理解JMX之介绍和简单使用
原文链接:https://blog.csdn.net/lmy86263/article/details/71037316 近期在项目上需要添加一些功能,想把一个开源工程整合进来,虽说是整合,但是觉得跟 ...
- 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)
salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL) salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...
- 【转载】Ssh整合开发介绍和简单的登入案例实现
Ssh整合开发介绍和简单的登入案例实现 Ssh整合开发介绍和简单的登入案例实现 一 介绍: Ssh是strtus2-2.3.1.2+ spring-2.5.6+hibernate-3.6.8整合的开 ...
- python模块介绍- HTMLParser 简单的HTML和XHTML解析器
python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- WebRTC介绍及简单应用
WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. WebRTC实时 ...
- 1. pyhanlp介绍和简单应用
1. pyhanlp介绍和简单应用 2. 观点提取和聚类代码详解 1. 前言 中文分词≠自然语言处理! 中文分词只是第一步:HanLP从中文分词开始,覆盖词性标注.命名实体识别.句法分析.文本分类等常 ...
- C#串口介绍以及简单串口通信程序设计实现
C#串口介绍以及简单串口通信程序设计实现 周末,没事干,写个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口) ...
- 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...
随机推荐
- kafka删除topic中的数据,适用于比较高的版本
server.properties中增加选项 delete.topic.enable=true 修改之后重启kafka 进入kafka目录,输入命令 bin/kafka-topics.sh --zoo ...
- 第一课 Dubbo背景及原理
1 . 技术背景 Dubbo每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo是一个阿里巴巴开源出来的一个分布式服务框架,致力于 ...
- Emmet快速语法—助力HTML/CSS一行代码一个页面
学会之后牛掰的场景如下 我们的目标就是用一行代码=>写下面这样的长长长长的HTML结构来. 如:table>(thead.text>th{手机1}*4)+(tbody.text$*4 ...
- 全面的Docker快速入门教程
前言: 都2021年了,你还在为了安装一个开发或者部署环境.软件而花费半天的时间吗?你还在解决开发环境能够正常访问,而发布测试环境无法正常访问的问题吗?你还在为持续集成和持续交付(CI / CD)工作 ...
- 微信小程序(六)
MINA 框架: 启动: 冷启动,热启动 加载: 生命周期 路由: 事件: 事件时视图层到逻辑层的通信方式 事件可以将用户的行为反馈到逻辑层进行处理 事件可以绑定在组件上,触发事件后就会执行逻辑层对应 ...
- 自定义 OpenShift s2i 镜像与模板——OracleJDK8
本文目标 由于 OpenShift 官方提供的镜像与模板(OpenJDK8)不完全满足业务需要: 不包含飞行记录功能.只有 OpenJDK11 以上才被 Oracle 开源 生成堆 dump 很大很慢 ...
- X-MagicBox-820的luatOS之路连载系列2
这块MagicBox小巧但外设丰富,盖板上的小液晶屏竟有240*240的分辨率.点亮后若是用最小字体,真有看瞎老王的不瞎之眼之势. 这种屏在某宝也是比较多的,大概就是长这样子: 我们这个820的盖板上 ...
- Python学习手册——第二部分 类型和运算(1)之字符串
Python全景 1.程序由模块构成. 2.模块包含语句. 3.语句包含表达式. 4.表达式建立并处理对象. 在python中数据是以对象的形式出现的!!! 为什么使用内置类型 内置对象使程序更容易编 ...
- C# Pechkin初始化一次后被锁住的问题
Pechkin.dll可用于pdf的生成,常规用法网上都有介绍:https://www.cnblogs.com/felixnet/p/5143934.html 但是当在一个页面上执行过一次之后,再次就 ...
- BehaviorTree.CPP行为树BT的入门(二)
节点与树 用户必须创建自己的ActionNodes和ConditionNodes(LeafNodes):该库可帮助您轻松地将它们组成树. 将LeafNodes视为组成复杂系统所需的构建块. 根据定义, ...