`
liangwj72
  • 浏览: 11914 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring + JMX 入门

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

1.连接器
参考手册中介绍了无数连接器,包括rmi/iiop/Burlap/Hessian/SOAP等等,非常的多。但实际上,我们用得上的并不多。最容易配的是rmi,转帖参考手册中的例子:
<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的配置:
<?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
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
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
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则是在系统运行时动态注册的。
分享到:
评论
2 楼 sl514 2012-06-05  
如果有项目下载就好了
1 楼 onlydo 2008-01-07  
好!ding.还不能只说一个“好”,晕。

相关推荐

    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 ...

    搞定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 ...

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

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

    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面试题 75道.pdf

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

    spring API英文版

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

    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 5 英文文档全套.7z

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

    spring-boot-reference2.0

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

    Getting started with spring framwork.pdf

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

    spring-framework-5.0 中文文档PDF

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

    Spring2.5-中文参考手册 chm格式

    - **快速入门**:介绍如何设置Spring环境,创建第一个Spring项目,并解释了基本的配置文件结构。 - **IoC容器**:深入解析IoC容器的工作原理,包括Bean的定义、实例化、初始化和销毁,以及Bean之间的依赖关系。 - ...

    Spring攻略(第二版 中文高清版).part1

    10.1 Flex入门 388 10.1.1 问题 388 10.1.2 解决方案 388 10.1.3 工作原理 388 10.2 离开沙箱 393 10.2.1 问题 393 10.2.2 解决方案 394 10.2.3 工作原理 394 10.3 为应用添加Spring BlazeDS支持 ...

    springboot 搭建入门

    **Spring Boot 搭建入门** 要搭建 Spring Boot 项目,首先需要创建一个父模块工程,它会作为管理子模块的容器。父模块中通常包含一个 pom.xml 文件,用于管理项目依赖。在父模块中,可以使用 `spring-boot-starter-...

Global site tag (gtag.js) - Google Analytics