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

2014-11-24 02:38:33 · 作者: · 浏览: 3
有时候我们需要监控各个分机器的状态,比如想知道机器此时此刻的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配置文件增加以下内容
Java代码


depends-on="rmiRegistry">



value="service:jmx:rmi://localhost/jndi/rmi://localhost:8080/myconnector" />






刚才我们将我们的MBean注册到一个基于RMI访问方式的连接服务上(ConnectorServerFactoryBean),占用的端口是8080。这时启用jconsole以远程方式连接,不用输入密码,如下图所示


之后和在本地操作一样,可以监控MBean的属性状态,也可以进行相应的操作。
5. 监控Web容器
如果我们要监控一下Web服务器,比如Tomcat服务器的JVM状态怎么办?这种场景非常的常见。其实配置也很简单。我们打开{Tomcat_HOME}/bin/catalina.bat,在linux下是{Tomcat_HOME}/bin/catalina.sh文件。将原有的脚本
Java代码
set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
替换成为
Java代码
rem 配置JMX服务端口
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmx