Java分布式应用学习笔记08JMX规范与常用的监控场景(一)

2014-11-24 02:38:33 · 作者: · 浏览: 6

1. JMX规范
JMX是“Java管理扩展的”的缩写,它和其他JavaEE类似也是曾经的Sun提出的一种规范(规约),从名字上可以看出主要是负责系统管理。是一个为系统加入或者说扩展成有管理功能的规约,只要按照这套规约行事,您的系统,某些某块就具备被其他工具(例如JConsole)管理的能力。换句话说就是可以用JMX来监控咱们的系统运行情况,还有可以在运行时环境像Web Service、RMI一样调用系统管理类的一些方法。实现此规范的框架也很多:Spring、Tomcat、JBoss容器……
2. 场景简述
咱们先假设一个情景,夫妻二人。男的因为工作需要要去外地出差,因公司规定,出差不能带家属,女方不能跟过去啊。所以女方给他们2个人一个手机——HTC吧。里面有个小程序,叫做JMXImpl4Android。等到男方出差在外地了,在外地出差的城市,一天晚上和同事散步,路上遇到个发廊(各位男性朋友明白的啊)。此时远在另一个城市的妻子的手机突然响了,手机GIS定位信息告知妻子:“您的丈夫在一个发廊门前徘徊,请注意”。妻子急了,立刻给丈夫打电话:“你干嘛呢?”。丈夫战战栗栗,汗出如浆,乖乖的回酒店玩DOTA了!
我们来用Java消息扩展的视角来看看这个场景,咱们伟大一些相当于那个妻子,那个丈夫就相当于咱们的系统,出差事件相当于咱们将系统部署到了真正的远程的运行环境,妻子曾HTC手机给丈夫您可以理解成把丈夫打造成具有JMX规范的系统,换句话说:此丈夫可监控。因为一个小小的GIS应用就能让妻子随时监控丈夫的状态——想邪恶一把,并且还可以根据系统的状态进行相应的措施——打电话告诉丫的别想出轨,虽然新的婚姻法下来了,但是房子是老娘买的,出轨?你试试!
看到这里,大家估计明白了JMX是什么东西,干什么用的了。但是估计大家有一个疑问,这个和Java分布式系统有什么关系啊?在分布式系统中有时候我们需要监控各个分机器的状态,比如想知道机器此时此刻的Tomcat的运行状况如何,还可以根据状况调用相关的操作,比如shutdown服务、去除已部署的web工程等等与服务有关的操作。或者对于调度这些节点机的主控机器也可以进行监控,在远程使用一个JConsole调用即可。Ok,说了这么多,我们看示例吧,最后再来用实例解释JMX的那些晦涩的理论概念。
3. 监控本机程序
这种场景在实际中不太常用,对于本机的程序来说,需要监控,按需调用被托管的类方法还真不多。
相当于丈夫就在你面前,他的一举一动都在你眼皮底下,你还需要一个Android小程序去监控他吗?笔者使用的是Spring3的实现。所以先将Spring的包下载下来,放到项目的classpath中。
咱们先写一个最普通的JavaBean
Java代码
package jmx;

public class HusbandLocal {

// 属性
private String name;
private int age;
private String message;

// set,get
public String getName() {
System.out.println("name:"+name);
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
System.out.println("age:"+age);
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getMessage() {
System.out.println("message:"+message);
return message;
}

public void setMessage(String message) {
this.message = message;
}

// 额外的操作,方法
public void call(String message) {
System.out.println("丈夫的call:" + message);

}

public void look(){
System.out.println("发现发廊");
}

public void playDOTA(){
System.out.println("这个不用解释了吧~DOTA");
}

}

以上Bean我们将它像Web Service一样(但是不是啊)暴露成JMX托管服务类。配置Spring文件内容如下
Java代码
< xml version="1.0" encoding="UTF-8" >
http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


lazy-init="false">











org.springframework.jmx.export.MBeanExporter是Spring暴露管理Bean(MBean)的核心类之一。它使用一个Map类型的属性——beans记录要暴露MBean的类。将咱们刚刚写的HusbandLocal以属性注入的方式注入进去。之后写一个加载Spring文件的main实例,开启服务。
Java代码
// 加载配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");

// 通过死循环保证主线程一直运行
while (true) {

}

点击进去后可以查看咱们刚才暴露的MBean,如下


我们可以点击MBean的操作,比如playDOTA(),后台就调用了该方法。在这个界面还可以看到MBean的属性值,你叫他们状态也行。
如此,我们完成了一个本地监控MBean对象的小功能。不过就像原来说的,这有个问题就是咱们之前说的,这种本地场景不多见,不常用。Ok,咱们看看要想远程监控需要做些什么事情。
4. 监控远程程序
下面我们尝试在远程监控咱们这个“丈夫”。
首先在Spring配置文件增加以下内容
Ja