`

Spring + JMX 入门(转)

阅读更多

 这篇文章主要是结合实际应用的情况对Spring开发参考手册20章的补充,提供一些建议给刚接触JMX的开发人员,让大家更轻松的使用JMX。 

 

1.连接器 

参考手册中介绍了无数连接器,包括rmi/iiop/Burlap/Hessian/SOAP等等,非常的多。但实际上,我们用得上的并不多。最容易配的是rmi,转帖参考手册中的例子: 

Java代码 

<bean id="serverConnector"  

      class="org.springframework.jmx.support.ConnectorServerFactoryBean">  

  <property name="objectName" value="connector:name=rmi"/>  

  <property name="serviceUrl"   

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

</bean>  

 

这种方式配起来最简单,不需要任何附加的库。用起来也不麻烦,在命令行运行jconsole,然后输入上面的serviceUrl就可以了。 

 

这是最容易配的,但不是最好用的。因为程序开发出来后,程序的监控/管理界面一般是由业务人员或者客户来使用,并不是程序员在使用,他们的机器上很少装有jdk,没jconsole可用;还有一个缺点就是serviceUrl未免太长了,非常不容易记。很多时候程序员自己都不记得,就更别说其他人了。 

 

最简单的最好用的还是通过IE就可以查看和管理了,这里我推荐mx4j,这个工具包提供了一个http的管理界面,非常好用。下载:http://jaist.dl.sourceforge.net/sourceforge/mx4j/mx4j-3.0.2.zip。以下是最简版的使用mx4j的配置: 

Java代码 

<?xml version="1.0" encoding="utf-8"?>  

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  

<beans>  

    <!-- MBeanExporter -->  

    <bean id="exporter"  

        class="org.springframework.jmx.export.MBeanExporter"  

        depends-on="mbeanServer">  

        <property name="beans">  

            <map>  

                <entry key="JmxTest:name=RuntimeInfo"  

                    value-ref="managerRuntime" />  

                <entry key="MX4J:name=HttpAdaptor"  

                    value-ref="httpAdaptor" />  

            </map>  

        </property>  

        <property name="server" ref="mbeanServer" />  

        <property name="assembler">  

            <bean id="assembler"  

                class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">  

                <property name="attributeSource">  

                    <bean id="attributeSource"  

                        class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />  

                </property>  

            </bean>  

        </property>  

    </bean>  

    <!-- MBeanServerFactoryBean -->  

    <bean id="mbeanServer"  

        class="org.springframework.jmx.support.MBeanServerFactoryBean">  

    </bean>  

 

    <!-- HttpAdaptor & XSLTProcessor -->  

    <bean id="httpAdaptor"  

        class="mx4j.tools.adaptor.http.HttpAdaptor">  

        <property name="processor">  

            <!-- XSLTProcessor -->  

            <bean id="xsltProcessor"  

                class="mx4j.tools.adaptor.http.XSLTProcessor" />  

        </property>  

        <property name="port" value="7788" />  

    </bean>  

    <bean id="managerRuntime"  

        class="jmxTest.mbean.ManagerRuntimeMBean">  

    </bean>  

</beans>  

 

这几乎是无法在精简的配置了。里面的managerRuntime是样例的mbean。 

 

2.MBeanInfoAssembler 

这个接口的用途是将你所需要变成MBean类的信息提取出来,并生成MBean。Spring大大简化了MBean的实现方式,我们现在已经不需要自己实现MBean接口定义的方法了。在参考手册中介绍了好几种MBeanInfoAssembler接口,我们在网上常见的例子就是SimpleReflectiveMBeanInfoAssembler,这个接口通过反射的方法提取出我们要管理的类的信息,包括里面有什么方法啊,各个方法有什么参数啊,等等。 

 

这个接口真简单,我们什么都不用管了,但实际使用的时候,我们发现一些问题: 

a. 我们无法为每个方法加注释,以及帮这个MBean加注释,管理界面都是一堆方法名,业务人员经常过来东问西问,真麻烦。 

b. 反射时把类的所有方法都找了出来,甚至连用于spring 注入的setter,getter等完全不搭边界的东西也暴露出来,以至于管理界面上有N多的方法,眼都花。 

 

本人强烈推荐用AnnotationJmxAttributeSource,看到Annotation字样,大家也就知道是用jdk1.5的Annotation了。确实如此,我们可以非常方便的用Annotation加注释,并限制某些方法不要暴露出去。参考手册上有详细的例子,我下面给的例子则是简化版: 

 

jmxTest/mbean/ManagerRuntimeMBean.java

Java代码 

package jmxTest.mbean;  

 

import org.springframework.jmx.export.annotation.ManagedAttribute;  

import org.springframework.jmx.export.annotation.ManagedOperation;  

import org.springframework.jmx.export.annotation.ManagedResource;  

 

@ManagedResource(description = "VM运行状态")  

public class ManagerRuntimeMBean {  

 

    private long getMax() {  

        return Runtime.getRuntime().maxMemory() >> 20;  

    }  

 

    private long getTotal() {  

        return Runtime.getRuntime().totalMemory() >> 20;  

    }  

 

    private long getFree() {  

        return Runtime.getRuntime().freeMemory() >> 20;  

    }  

 

    private long getUsed() {  

        return getTotal() - getFree();  

    }  

 

    @ManagedAttribute(description = "可分配的最大内存")  

    public String getMaxMemory() {  

        return getMax() + " M";  

    }  

 

    @ManagedAttribute(description = "已分配内存")  

    public String getTotalMemory() {  

        return getTotal() + " M";  

    }  

 

    @ManagedAttribute(description = "已使用内存")  

    public String getUsedMemory() {  

        return getUsed() + " M";  

    }  

 

    @ManagedOperation(description = "Shutdown VM")  

    public void shutdown() {  

        Runtime.getRuntime().exit(0);  

    }  

}  

 

和参考手册上例子不同地方在于,我们只使用@ManagedResource这些注释中最简单的功能,而不是参考手册上非常长的一大段。 

 

上面例子中没有加@ManagedAttribute的那几个方法不会被暴露出去。下面的例子则是对方法参数加说明的例子 

jmxText/mbean/Mbean1.java 

Java代码 

package jmxTest.mbean;  

 

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(description = "mbean1")  

public class Mbean1 {  

    private String p1;  

 

    @ManagedAttribute  

    public String getP1() {  

        return p1;  

    }  

 

    @ManagedOperation(description="方法P1 的说明")  

    @ManagedOperationParameters({  

        @ManagedOperationParameter(name = "p1", description = "参数 p1 的说明")})  

    public void addP1(String p1) {  

        this.p1 = p1;  

    }  

}  

 

 

3.启动 

最后一个程序则是启动程序,我们让系统跑起来 

JmxTestStart.java 

Java代码 

package jmxTest;  

 

import java.io.IOException;  

 

import javax.management.MalformedObjectNameException;  

 

import jmxTest.mbean.Mbean1;  

import mx4j.tools.adaptor.http.HttpAdaptor;  

 

import org.springframework.context.ApplicationContext;  

import org.springframework.context.support.ClassPathXmlApplicationContext;  

import org.springframework.jmx.export.MBeanExporter;  

import org.springframework.jmx.support.ObjectNameManager;  

 

public class JmxTestStart {  

    public static void main(String[] args)  

            throws IOException,  

                MalformedObjectNameException, Exception {  

        ApplicationContext ctx = new ClassPathXmlApplicationContext(  

                new String[] { "beanRefJMXServer.xml", });  

 

        //启动 HttpAdaptor,mx4j的HttpAdaptor真讨厌,要手工启动  

        HttpAdaptor httpAdaptor = (HttpAdaptor)ctx.getBean("httpAdaptor");  

        httpAdaptor.start();  

 

        //动态注册一个MBean的例子  

        MBeanExporter exporter = (MBeanExporter) ctx.getBean("exporter");  

        exporter.registerManagedResource(new Mbean1(),  

                ObjectNameManager.getInstance("ZtManager:name=mbean"));  

    }  

}  

 

注意,这个启动程序还有一个特别之处,第一个例子ManagerRuntimeMBean是在配置文件中说明要变成MBean的,第二个例子Mbean1则是在系统运行时动态注册的。

分享到:
评论

相关推荐

    spring框架下jmx入门例子

    本教程将引导你入门Spring框架下的JMX应用。 首先,JMX是一种Java标准,它允许开发者创建可管理的Java组件,并提供了一种统一的方式来管理和监控这些组件。在Spring中,我们可以利用JMX来创建MBeans(Managed Beans...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    Struts+Hibernate+Spring入门教程及实例.rar

    除此之外,Spring的事务管理、安全性以及对其他技术(如JMS、JMX)的支持,使得它成为企业级应用的首选框架。 **整合Struts、Hibernate和Spring**: 这三大框架的整合被称为SSH(Struts、Spring、Hibernate)集成,...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    jmx入门

    为什么JMX那么受欢迎,JMX到底有那些优势只得人们去学习和理解,本文从JMX的基本架构、hellowold jmx以及spring对JMX的支持讲起,希望大家能通过本文对JMX有个基础的认识,并能通过本文为今后学习JMX打个基础

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 1.3.2 容器类型 1.4 ...

    jmx入门[参照].pdf

    JMX使得开发者能够轻松地添加管理功能,同时,由于它的灵活性,可以与各种管理工具和框架(如Spring)集成,提升整体系统的可管理性和可维护性。 总的来说,JMX是Java世界中一个强大的工具,用于构建可管理和可监控...

    JMX开发入门

    Java Management Extensions(JMX)是...例如,Spring框架提供了对JMX的集成支持,简化了在Spring应用中使用JMX的复杂性。总的来说,JMX因其灵活性、标准化和广泛的生态系统支持,成为了Java环境中不可或缺的管理工具。

    spring API英文版

    2. **Data Access/Integration**:这部分涵盖了数据库访问和集成,如JDBC抽象层、ORM(对象关系映射)支持,如Hibernate、MyBatis等,以及JPA(Java Persistence API)和JMX(Java Management Extensions)的支持。...

    Spring面试题 75道.pdf

    Spring框架由多个模块组成,这些模块包括核心容器(Core Container,如Core和Beans模块)、AOP模块、设备支持(Instrumentation)、数据访问/集成(如JDBC、ORM和JMX模块)、Web模块(如Spring MVC和WebSocket)、...

    spring boot实战.pdf高清无水印

    1.2 Spring Boot入门 6 1.2.1 安装Spring Boot CLI 7 1.2.2 使用Spring Initializr初始化Spring Boot项目 10 1.3 小结 18 第2章 开发第一个应用程序 19 2.1 运用Spring Boot 19 2.1.1 查看初始化的...

    Spring 5 英文文档全套.7z

    历史,设计理念,反馈,入门。 核心 IoC容器,事件,资源,i18n,验证,数据绑定,类型转换,SpEL,AOP。 测试 模拟对象,TestContext框架,Spring MVC测试,WebTestClient。 资料存取 事务,DAO支持,JDBC,O / ...

    SpringBoot基础入门demo

    **SpringBoot基础入门** SpringBoot是由Pivotal团队提供的全新框架,其设计目标是用来简化Spring应用的初始搭建以及开发过程。它集成了大量的常用组件,提供了自动配置的"starter"项目对象模型(POM),使得开发者...

    springMongodb参考文档中文版

    - **入门**:介绍了如何使用Spring Data MongoDB的反应式支持。 - **连接MongoDB**:通过Spring框架和反应式驱动程序连接MongoDB的方法。 - **ReactiveMongoTemplate**:类似于MongoTemplate,但专注于反应式编程...

    Spring4,中文版

    6. **与其他开源技术的集成**:Spring框架可以轻松集成其他流行的技术,如 Quartz 定时任务、Quartz Spring、JMS、JMX等,为开发者提供了一站式的解决方案。 在《Spring4 中文版》这份文档中,你将深入了解到如何...

    spring-framework-5.0 中文文档PDF

    在入门指南部分,文档可能提供了如何开始使用Spring Framework的基础知识,包括一些基础概念和必要的配置,帮助新手快速上手。 接着,在介绍Spring框架的章节中,文档可能介绍了Spring的整体架构,包括它的各种模块...

    spring-boot-reference2.0

    Spring Boot 并不试图覆盖所有 Spring 功能,而是为最常见的用例提供一个更快、更便捷的入门途径。 1. **起步依赖(Starters)** Spring Boot 的核心特性之一是起步依赖。这些预定义的 Maven 或 Gradle 依赖组合,...

    Spring Boot实战 ,丁雪丰 (译者) 中文版

    1.2 Spring Boot入门 6 1.2.1 安装Spring Boot CLI 7 1.2.2 使用Spring Initializr初始化Spring Boot项目 10 1.3 小结 18 第2章 开发第一个应用程序 19 2.1 运用Spring Boot 19 2.1.1 查看初始化...

    Getting started with spring framwork.pdf

    ### Spring框架入门与基础知识 #### 引言 Spring框架是一款为简化企业级应用程序开发而设计的开源框架。它提供了一套全面的编程和配置模型,支持多种应用开发场景,包括Web应用、移动应用以及传统的服务器端应用等...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    9.4.1 Spring Integration 快速入门 395 9.4.2 Message 395 9.4.3 Channel 395 9.4.4 Message EndPoint 398 9.4.5 Spring Integration Java DSL 400 9.4.6 实战 400 第10 章 Spring Boot 开发部署与测试 407 10.1 ...

Global site tag (gtag.js) - Google Analytics