Skip to content
梁韦江 edited this page Dec 9, 2015 · 13 revisions

JmxInWeb是个什么东西?

简单的来说,这是一个很有意思的工具,用于放在我们的java项目中,实时查看系统的运行情况,方便我们实时进行一些调试和配置修改,同时检查死锁。

可能很多高手早就知道了jmx是什么,jconsole是什么,不需要我一一解释,但这个项目存在的意义之一就是让新手也能参与,让新手们有个可实际动手的例子,更快的掌握java的编程技术。所以,我先从基础说起。

这是个用于学习的项目

本项目的目的是用尽量简单的方式做一个常用的工具出来,为java的初学者们提供一个学习和实践的机会。

如何看效果?

运行com.ynitq.utils.jmxInWeb.TestJmxHttpServer, 然后在浏览器中打开 http://localhost:8080/

很多java的初学者一开始就直接用Spring 、Struts等等框架,并不了解为什么要用这些框架,所以我们尽量用一些原始的手段来实现MVC的框架,让初学者们了解Web项目中MVC的原理。

什么是JMX

  • 非常官方的说法:

    JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

  • 简单的说法:

    当年设计java语言的高手们设计了一个接口,让我们可以通过各种工具通过这个接口访问java虚拟机的内部的各种参数,我们也可以自己写一个遵循这个接口类,反映一下我们的程序的各个状态,然后我们可以工具软件就可以知道我们的程序运行时的各类状态。

    可能这个时候立刻就有人说:我们如果想知道程序的状态,我们可以用打log啊,我们可以通过web界面展示啊,我们为什么要折腾这个叫JMX的东西呢。答案就是:我们懒,写log不能实时反映状态,写web界面太麻烦了,最好就是我们就简单的写个类,某某工具就该自动能生成界面并调用这个类的方法,于是,JMX这个东西就出现了。

    ** 想偷懒,是推动一切软件科技发展的原动力 **

  • 我们有什么工具可访问JMX?

    设计java的高手们早就为我们在jdk中准备了一个工具jconsole了,只要我们转了jdk,jconsole.exe就存在了。我们直接在命令行下敲jconsole就行了,多简单啊。

JMX相关代码

  • 遵循Jmx接口规范的类叫MBean,这些MBean只要注册到MBeanServer后,我们就可以在外面通过工具实时操作这些类的方法了。

  • 自己写MBean是个非常麻烦的事情,就不是一般般的麻烦,这东西明显有违 我们要偷懒 的原则。幸好,幸好!我们有Spring!Spring将原来一个很复杂的过程变成了一个三言两语就可以搞定的事情。long live Spring Framework!

  • 虚拟机中有很多个MBeanServer,我们可以通过 java.lang.management.ManagementFactory 这个类 获取系统内置的MBeanServer,也可以创建自己的MBeanServer,例如:

    //我们自己创建一个
    MBeanServer myServer = MBeanServerFactory.createMBeanServer("JmxInWeb");

    //我们获取记录了系统各类信息的MBeanServer
    MBeanServer platformServer = ManagementFactory.getPlatformMBeanServer();

jconsole工具

好吧,这个时候就让大家认识一下jconsole这个精彩的工具了,首先,我们随便启动一个java的程序,例如 eclipse,tomcat什么的,这些在大家的机器上十有八九都安装好了。

  1. 然后,我们在开命令行敲jconsole,我们就该看到如下的画面:

    启动

    瞧,启动了,很明显,我们发现可以连接本地运行中的java程序,也可以连接远程服务器上的程序。连接本地就简单了,点击就好,但如果连接远程的呢?这个稍后再说,因为很麻烦,这个麻烦本来就是我们做本项目的原因。

  2. 随便选择一个本地java进程后,我们将看到这样的画面:

    摘要

    瞧,多精彩,我们看到了这个java程序当前的各类参数,内存使用、线程数等等。这工具调用了相关的MBean,并将结果以很友好的界面展现出来。

  3. 如果我点击标签栏中的“VM摘要”,我们还可以看到虚拟机、操作系统、硬件的信息

    虚拟机

  4. 要看更加的精彩的部分,请点击标签栏的“线程”:

    线程

    jconsole不但调用了线程相关MBean,让我们看到每个线程当前运行到哪了,最难得的是居然有按钮可以实时检测死锁相关的MBean,这个功能对于高并发的项目实在是太重要的,死锁是没有办法通过测试用例检测出来的,只有运行时才会发生,如果没有这个工具,我们将难以定位发生死锁的地方。

jcnsole的缺点

  • 首先 jconsole连接的是 ManagementFactory.getPlatformMBeanServer() 获得的MBeanServer,连的不是我们自己创建的。

  • 连接远程服务器时,那个连接非常麻烦,如果远程服务器上的防火墙开发了所有端口,我们可以用标准的url访问,例如: service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi

    但现实中,因为安全问题,我们只会用ssh隧道的方法访问,于是就出现超复杂的url,例如: service:jmx:rmi://localhost:11097/jndi/rmi://localhost:11099/jmxrmi

  • 即使我们通过修改远程服务的url,连上我们自己的MBeanServer,那个操作界面简直就是惨不忍睹。

    MBean

代码规范

  • 请遵循google的代码规范
  • 请有良好的写测试用例的习惯,代码中有测试用例给各位参考

所以我们有了这样的想法

  • 能否不要搞什么连接,直接嵌入原来的java项目中,多省事。
  • web界面多好! Ajax多好!平板也能访问多好!
  • 界面能否好看点,看看人家Bootstrap嘛。

所以,这个项目就产生了