随笔 - 6, 文章 - 3, 评论 - 3, 引用 - 0
数据加载中……

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

现在大部分企业的应用程序都需要application提供监视程序运行的健康状况和硬件状况的功能。
举个例子,前段时间做的一个项目,需要在一台机器上监视几十台client的操作,CPU使用率,内存,硬盘等信息,当CPU,内存使用率过高时,发出通知到该client.甚至操作client的执行动作,都可用jmx做到。
今天将从简单入手结合jdk的Annotation来实践Spring对jmx的支持

 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans xmlns="http://www.springframework.org/schema/beans"
 3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
 5       
 6    <!-- mbean -->
 7 <bean id="mbeanManager" class="com.xmlasia.spring.test.jmx.MBeanManager"/>
 8 
 9 
10 <!-- JMX configuration -->
11 <!-- 创建一个mbeanServer -->
12 <bean id="mbeanServer" 
13    class="org.springframework.jmx.support.MBeanServerFactoryBean">
14 </bean>
15  
16 <!-- MetadataMBeanInfoAssembler是AutodetectCapableMBeanInfoAssembler 唯一实现
17  spring文档中有专门介绍AutodetectCapableMBeanInfoAssembler的章节
18  -->
19 <bean id="assembler"
20    class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
21  <property name="attributeSource" ref="jmxAttributeSource"/>
22 </bean>
23 
24 <!-- 解释mbean中Annotation的类,我们可以看到他给注入到assembler,被org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler包装-->
25 <bean id="jmxAttributeSource"
26    class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>
27
28         <!-- spring jmx最核心的类 -->
29 <bean id="mBeanExporter" class="org.springframework.jmx.export.MBeanExporter">
30  <property name="server" ref="mbeanServer"/>
31  <property name="assembler" ref="assembler"/>
32  <property name="beans">
33   <!-- 将mbean注册到mBeanExporter -->
34   <map>
35    <entry key="mbean:name=testBean" value-ref="mbeanManager"/>
36   </map>
37  </property>
38 </bean>
39</beans>
40



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


现在来看下我们的mbean

 1package com.xmlasia.spring.test.jmx;
 2
 3import org.springframework.jmx.export.annotation.ManagedAttribute;
 4import org.springframework.jmx.export.annotation.ManagedOperation;
 5import org.springframework.jmx.export.annotation.ManagedOperationParameter;
 6import org.springframework.jmx.export.annotation.ManagedOperationParameters;
 7import org.springframework.jmx.export.annotation.ManagedResource;
 8
 9@ManagedResource
10public class MBeanManager {
11 private int clientStatus;
12
13 @ManagedOperation(description = "pause a single proccess")
14 @ManagedOperationParameters( { @ManagedOperationParameter(name = "Name of proccess instance", description = "Mandatory") })
15 public void pause(String n) {
16  System.out.println("pause");
17 }

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

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

27
28 @ManagedAttribute(description = "client status")
29 public int getClientStatus() {
30  return clientStatus;
31 }

32
33 @ManagedAttribute(description = "client status")
34 public void setClientStatus(int clientStatus) {
35  this.clientStatus = clientStatus;
36 }

37}

38



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

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


该测试了

 1
 2public static void main(String[] args){
 3  ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/jmxContext.xml");
 4  
 5  while(true){
 6   try {
 7    Thread.sleep(1000);
 8   }
 catch (InterruptedException e) {
 9    // TODO Auto-generated catch block
10    e.printStackTrace();
11   }

12  }

13 }



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

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

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

posted on 2007-07-24 17:02 马甲丁 阅读(204) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: