JMX最常见的场景是监控Java程序的基本信息和运行情况,任何Java程序都可以开启JMX,然后使用JConsole或Visual VM进行预览。下图是使用Jconsle通过JMX查看Java程序的运行信息

从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之介绍和简单使用的更多相关文章

  1. 【转】理解JMX之介绍和简单使用

    原文链接:https://blog.csdn.net/lmy86263/article/details/71037316 近期在项目上需要添加一些功能,想把一个开源工程整合进来,虽说是整合,但是觉得跟 ...

  2. 【转载】salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)

    salesforce 零基础开发入门学习(三)sObject简单介绍以及简单DML操作(SOQL)   salesforce中对于数据库操作和JAVA等语言对于数据库操作是有一定区别的.salesfo ...

  3. 【转载】Ssh整合开发介绍和简单的登入案例实现

    Ssh整合开发介绍和简单的登入案例实现 Ssh整合开发介绍和简单的登入案例实现 一  介绍: Ssh是strtus2-2.3.1.2+ spring-2.5.6+hibernate-3.6.8整合的开 ...

  4. python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...

  5. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  6. WebRTC介绍及简单应用

    WebRTC介绍及简单应用 WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. WebRTC实时 ...

  7. 1. pyhanlp介绍和简单应用

    1. pyhanlp介绍和简单应用 2. 观点提取和聚类代码详解 1. 前言 中文分词≠自然语言处理! 中文分词只是第一步:HanLP从中文分词开始,覆盖词性标注.命名实体识别.句法分析.文本分类等常 ...

  8. C#串口介绍以及简单串口通信程序设计实现

    C#串口介绍以及简单串口通信程序设计实现 周末,没事干,写个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口) ...

  9. 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...

随机推荐

  1. Docker 部署前后端项目

    Docker 部署前后端项目 平生不会相思,才会相思,便害相思. 简介:都是被逼的,从零开始一个Docker 部署九个微服务和三个前端项目.其中,这些服务需要用到Nacos.MySQL.Nginx.E ...

  2. [JavaScript闭包]Javascript闭包的判别,作用和示例

    闭包是JavaScript最重要的特性之一,也是全栈/前端/JS面试的考点. 那闭包究竟该如何理解呢? 如果不爱看文字,喜欢看视频.那本文配套讲解视频已发送到B站上供大家参考学习. 如果觉得有所收获, ...

  3. idea使用git更新代码 : update project(git merge、git rebase)

    idea使用git更新代码 : 选中想要更新的项目,右键点击 git => repository => pull 这样使用一次后idea会自动建立选中分支的远程跟踪分支,以后可直接点击下图 ...

  4. 7-7 后缀式求值 (25分)的python实现

    exp=input().split() ls=list() def Cal(a,b,i): if i=="+": return a+b elif i=="-": ...

  5. go struct结构

    p.p1 { margin: 0; font: 12px ".PingFang SC"; color: rgba(69, 69, 69, 1) } span.s1 { font: ...

  6. 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项

    博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...

  7. c++学习笔记3(动态内存分配)

    为了效率,需要按需去进行动态内存分配,在c中,可以用malloc去实现动态内存分配,而在c++中,则用new运算符去实现. 用法一:动态分配一个变量的存储空间 p=new T T为类型名 P则为T*类 ...

  8. 一个简单的golang项目,实验 gitlab-ci-cd Pipelines

    至少两台主机,gitlab + gitlab-runner gitlab + gitlab-runner安装略 项目源码:https://gitee.com/M27149/testgo.git 在自建 ...

  9. [cf1305G]Kuroni and Antihype

    对整个过程构造一张有向图,其中$(x,y)\in E$当且仅当$x$把$y$加入,且边权为$a_{x}$ 显然这是一棵外向树森林,并再做如下两个构造: 1.新建一个点$a_{0}=0$,将其向所有入度 ...

  10. [hdu6978]New Equipments II

    显然可以费用流来做,具体建图如下-- 点集:源点,汇点,左边$n$​个工人,右边$n$​​​个设备 边集:源点向第$i$​个工人连$(1,a_{i})$​的边,第$i$​个设备向汇点连$(1,b_{i ...