论坛首页 Java企业应用论坛

Spring 2.x jmx 及应用(1)Annotation

浏览 2063 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-27  
现在大部分企业的应用程序都需要application提供监视程序运行的健康状况和硬件状况的功能。
举个例子,前段时间做的一个项目,需要在一台机器上监视几十台client的操作,CPU使用率,内存,硬盘等信息,当CPU,内存使用率过高时,发出通知到该client.甚至操作client的执行动作,都可用jmx做到。
今天将从简单入手结合jdk的Annotation来实践Spring对jmx的支持
代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
       
    <!-- mbean -->
   <bean id="mbeanManager" class="com.xmlasia.spring.test.jmx.MBeanManager"/>
   
   
   <!-- JMX configuration -->
   <!-- 创建一个mbeanServer -->
   <bean id="mbeanServer"
        class="org.springframework.jmx.support.MBeanServerFactoryBean">
   </bean>
      
   <!-- MetadataMBeanInfoAssembler是AutodetectCapableMBeanInfoAssembler 唯一实现
      spring文档中有专门介绍AutodetectCapableMBeanInfoAssembler的章节
    -->
   <bean id="assembler"
        class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
      <property name="attributeSource" ref="jmxAttributeSource"/>
   </bean>
   
   <!-- 解释mbean中Annotation的类,我们可以看到他给注入到assembler,被org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler包装-->
   <bean id="jmxAttributeSource"
        class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>

         <!-- spring jmx最核心的类 -->
   <bean id="mBeanExporter" class="org.springframework.jmx.export.MBeanExporter">
      <property name="server" ref="mbeanServer"/>
      <property name="assembler" ref="assembler"/>
      <property name="beans">
         <!-- 将mbean注册到mBeanExporter -->
         <map>
            <entry key="mbean:name=testBean" value-ref="mbeanManager"/>
         </map>
      </property>
   </bean>
</beans>


以前jmx的应用需要编写很长的代码来实现,现在你只需完成以上配置就可以实现一个简单的jmx server的程序,jmx server的实现有很多,通常情况下,jmx会需要一个容器例如jboss,现在的方法是将程序本身作为server,这个方式最经典的例子就是个大apserver,我的第一次jmx体验就是在看jboss源码时发起的。实现方式不同会用到不同的协议,这里我们需要jmxremote.jar,你可在spring的lib中找到。


现在来看下我们的mbean
代码:

package com.xmlasia.spring.test.jmx;

import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedOperationParameter;
import org.springframework.jmx.export.annotation.ManagedOperationParameters;
import org.springframework.jmx.export.annotation.ManagedResource;

@ManagedResource
public class MBeanManager {
   private int clientStatus;

   @ManagedOperation(description = "pause a single proccess")
   @ManagedOperationParameters( { @ManagedOperationParameter(name = "Name of proccess instance", description = "Mandatory") })
   public void pause(String n) {
      System.out.println("pause");
   }

   @ManagedOperation(description = "shut down the proccess")
   public void monitor() {
      System.out.println("shutting down...");
   }

   public void publicMessage() {
      System.out.println("public Message to monitor server");
   }

   @ManagedAttribute(description = "client status")
   public int getClientStatus() {
      return clientStatus;
   }

   @ManagedAttribute(description = "client status")
   public void setClientStatus(int clientStatus) {
      this.clientStatus = clientStatus;
   }
}


我们可以到类中定义了几个方法,monitor server可以通过clientStatus了解到client的状态,publicMessage是用来主动的发送消息到monitor server,所有不需要想外界暴露。monitor server可以通过
获得信息中的ObjectName和Ip来连接到client操作mbean.

mbean在jdk的标准实现是需要实现一个以MBean结尾的interface的,其中定义向外界暴露的方法和属性
现在之需要在类前定义@ManagedResource,在属性方法前分别用@ManagedOperation或者@ManagedAttribute修饰就可以了,Annotation实在是太方便了。未来将会有更多的应用。


该测试了
代码:

public static void main(String[] args){
      ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/jmxContext.xml");
      
      while(true){
         try {
            Thread.sleep(1000);
         } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }
   }


现在我们只需要让Spring加载上面那段bean的定义就好了。jmx mbean server的启动是不会阻塞主线程的,所以需要保持主线程活着,不然加载完main方法就结束了,mbean server也挂了。

jdk里有个强大的monitor server那就是jconsole,不过一次只有一个连接
大家可以用jconsole来连接到mbean,调用方法或属性察看结果。

spring jmx很有多有用的功能本人正在挖掘,过段时间再放出一些心得,欢迎有兴趣的一起讨论。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics