一、什么是JMX

JMS是一种Java规范,定义了如何管理一个软件系统(或应用程序)的规范。 对于一个简单的应用程序,该程序本身不需要被管理。但如果是开发的一个复杂系统(如一个电商平台、一个企业内部管理系统),则该系统本身也需要被管理,如需要了解这个软件的运行情况,比如某些状态是否正常、当前登录用户数,还有可能需要动态的调整系统的某些参数,如数据库链接池的大小、某些缓存的大小。

  JMS就是定义了这样的一套规范,有很多针对该规范的实现框架(如JBoss),SUN自己也对该规范有了一套实现,并且从JDK1.5开始,实现的核心jar包内置到了jre中,不需要单独下载jar包,只是一些外围的包还需单独下载。

利用JMX规范,以及相应的实现框架,可以很方便的为一个复杂的应用系统建立一个管理系统。实际上如Tomcat、weblogic、JBOSS等框架服务器系统,本身就提供了JMX服务。利用这些框架开发的系统天然就能支持JMX。

  使用JMX还有一个很大的好处是,甚至不需要开发自己的界面。我们知道,如果自己开发一个管理软件,肯定需要开发相关的界面(不管是WEB的还是GUI的),而开发界面的工作量可不小。而JMX因为是标准的规范,如果一个应用系统通过JMX来实现被管理,直接就能通过通用的管理软件或内置的html页面来访问操作。

  本文介绍如何在一个普通的应用程序中来通过JMX被管理.

二、JMX程序开发的基本流程

1、一个系统要被管理,首先需要抽象成一个或多个被管理对象,在JMX规范中就是一个MBean。一个MBean就是一个普通的java类,只是需要遵循相关的命名规范。实现一个被管理对象(MBean),需要定义一个java接口(暴露该对象可被访问和操作的信息),以及一个该接口的实现类。根据JMX的规范要求,接口的命名必须是实现类的名字后加MBean。

2、实现的MBean需要注册到MBean服务器上。

3、通过界面或代码访问这些MBean。

三、例子说明

1、定义MBean接口

  1. public interface DemoMBean {
  2. public String getMsg();
  3.  
  4. public void setMsg(String msg);
  5.  
  6. public void showMsg();
  7.  
  8. }

注意,接口名必须以MBean结尾

2、定义MBean的实现类

  1. public class Demo implements DemoMBean {
  2. private String msg;
  3.  
  4. public String getMsg() {
  5. return msg;
  6. }
  7.  
  8. public void setMsg(String msg) {
  9. this.msg = msg;
  10. }
  11.  
  12. public void showMsg() {
  13. System.out.println("Hello World, " + msg);
  14. }
  15.  
  16. }

注意,类名必须是 接口名除去后缀MBean。在这个例子中必须是Demo。

3、注册Mbean

  1. public class Agent {
  2. public static void main(String[] args) throws Exception {
  3. MBeanServer server = MBeanServerFactory.createMBeanServer();
  4.  
  5. //创建MBean并注册
  6. server.registerMBean(new Demo(), new ObjectName("mybean:name=xxx"));
  7.  
  8. //创建一个web适配器服务器,表示我们MBean服务通过web形式来提供给用户管理.
  9. //该web server本身也是一个MBean,也需要被注册. 参数是web服务器的端口号,默认是8082
  10. HtmlAdaptorServer htmlServer = new HtmlAdaptorServer(9999);
  11. server.registerMBean(htmlServer, new ObjectName("Agent:name=htmlServer"));
  12.  
  13. //启动web服务器,这样浏览器通过 http://localhost:9999/ 就可以访问和操作这些Mbean
  14. htmlServer.start();
  15.  
  16. }
  17.  
  18. }

运行该程序后,在浏览器输入 http://localhost:9999/ ,就可以看到定义的MBean,并通过页面提供的界面对MBean进行操作。

四、小结

文本介绍了一个最简单的JMX例子。但却基本涵盖了JMX的核心内容。JMX的核心就是将要被管理的信息封装成一个个的MBean对象。

然后将这些对象发布和注册到MBean服务器上。 这样用户就可以通过相关的界面或api方式去访问这些MBean,就可以通过MBean接口定义的相关方法获取相关的信息,或者执行相关的动作。

利用Java内置的API开发JMX功能的更多相关文章

  1. 利用Tomcat内置的servlet实现文件下载功能

    起因 最近博客所在的VPS挂了又要重装系统,又要重装各种软件. 以前我也经常更换VPS,每次更换都是各种坑爹事情..比如要下载java.下载tomcat.下载mysql..........以前每次我都 ...

  2. 【微网站开发】之微信内置浏览器API使用

    最近在写微网站,发现了微信内置浏览器的很多不称心的地方: 1.安卓版的微信内浏览器底部总是出现一个刷新.前进.后退的底部栏,宽度很大,导致屏幕显示尺寸被压缩 2.分享当前网站至朋友圈时,分享的图片一般 ...

  3. Java 性能分析工具 , 第 2 部分:Java 内置监控工具

    引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...

  4. 深入理解Java内置锁和显式锁

    synchronized and Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两 ...

  5. 使用Java内置的Http Server构建Web应用

    一.概述 使用Java技术构建Web应用时, 我们通常离不开tomcat和jetty之类的servlet容器,这些Web服务器功能强大,性能强劲,深受欢迎,是运行大型Web应用的必备神器. 虽然Jav ...

  6. 【Android】18.1 利用安卓内置的定位服务实现位置跟踪

    分类:C#.Android.VS2015: 创建日期:2016-03-04 一.安卓内置的定位服务简介 通常将各种不同的定位技术称为位置服务或定位服务.这种服务是通过电信运营商的无线电通信网络(如GS ...

  7. 为什么阿里Java规约禁止使用Java内置线程池?

    IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...

  8. SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

    SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...

  9. 如何利用.Net内置类,解析未知复杂Json对象

    如何利用.Net内置类,解析未知复杂Json对象 如果你乐意,当然可以使用强大的第三方类库Json.Net中的JObject类解析复杂Json字串 . 我不太希望引入第三方类库,所以在.Net内置类J ...

随机推荐

  1. C#利用委托跨线程更新UI数据

    转:http://www.2cto.com/kf/201206/136587.html 在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面 ...

  2. setInterval(code, time)中code传递参数办法

    1.使用setInterval的场景 有时我们需要隔一定的时间执行一个方法,这时就会用到setInterval,但是由于这个方法是浏览器模拟出的Timer线程,在调用我们方法时不能为其传递参数. 2. ...

  3. php随笔5-thinkphp OA系统 人力资源管理

    最近闲来无事,自己尝试通过thinkphp3.1.3框架开发一套自己的OA系统,目前已完成了人力资源管理部分的内容,遇到并解决了几个问题. 1.由于刚开始不太熟悉thinkphp的框架,花费了一些功夫 ...

  4. SQL Identity自增列清零方法

    1.使用DBCC控制台命令: dbcc checkident(表名,RESEED,0) 2.truncate table 也可将当前标识值清零 但当有外键等约束时,无法truncate表 可以先禁用外 ...

  5. float 保留两位小数

    1.页面运算格式化数字 页面上有时候会用到数字的运算,运算过后会出现1.5999999999999这么长的数字,需要格式化数字,比如保留两位有效数字 首先导入这个标签 <%@ taglib ur ...

  6. vs2010 调试 调用堆栈 窗口

    msdn 如何使用call stack窗口: http://msdn.microsoft.com/zh-cn/library/a3694ts5(v=vs.90).aspx 使用“调用堆栈”窗口可以查看 ...

  7. linux常用命令加实例大全

    目  录引言    1一.安装和登录    2(一)    login    2(二)    shutdown    2(三)    halt    3(四)    reboot    3(五)    ...

  8. IT第七天 - 类及其属性、方法的理解,断点调试初识,代码优化总结,编程逻辑培养

    IT第七天 上午 类 1.对象:是多个实体抽象出来的共同点集合,对象包括:属性(即实体的特征).方法(即尸体的功能作用) 2.程序中,用类来模拟对象 3.类是抽象的,是对象的类型,是将多个拥有相同属性 ...

  9. 经典switch

  10. TCP之超时和重传

    RTT:往返时间:  RTO:Retransmission Timeout即超时重传时间: 关键点在于:超时和重传间隔的策略,即怎样确定超时间隔和重传间隔: TCP中的四个定时器:2MSL定时器:重传 ...