`
liangwj72
  • 浏览: 11771 次
  • 性别: 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,可以动态修改远程服务端的属性,使用http协议,可以直接通过IE查看运行结果

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

    jmx入门

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

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

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

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

    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 查看初始化...

    springMongodb参考文档中文版

    1.了解Spring 2.了解NoSQL和文档数据库 3.要求 4.其他帮助资源 4.1。支持 4.1.1。社区论坛 4.1.2。专业支持 4.2。发展之后 5.新&值得注意的 5.1。Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0...

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

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

    (2.0版本)自己写的struts2+hibernate+spring实例

    common.jar jboss-jmx.jar jboss-system.jar jacc-1_0-fr.jar jgroups-2.2.8.jar oscache-2.1.jar proxool-0.8.3.jar swarmcache-1.0rc2.jar classes12.jar spring.jar ...

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

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

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

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

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

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

    tasks:Spring Boot和ActiveMQ Artemis的生产者消费者微服务教程

    -&gt; DTO的映射器记录中测验使用DataJpaTest的存储库使用DataMongoTest的存储库使用Mockito的服务使用WebMvcTest的端点使用OpenPojo的Pojos和Dtos JMX入门使用Docker简化开发本教程的目的是提供一个Producer消费者...

    embedded-jmxtrans:进行中的JMX指标导出器

    嵌入式jmxtrans ...启用了Spring Framework的Web应用程序的入门指南。 玛文 添加embedded-jmxtrans依赖项 &lt; groupId&gt;org.jmxtrans.embedded &lt; artifactId&gt;embedded-jmxtrans &lt; version&gt;1.0.12&lt;/ version

    spring-boot-admin:用于管理Spring Boot应用程序的Admin UI

    endpoint 轻松的日志级别管理与JMX-beans交互查看线程转储查看http-traces 查看审核事件查看http端点查看预定的任务查看和删除活动会话(使用spring-session) 查看Flyway / Liquibase数据库迁移下载heapdump 状态...

    springboot参考指南

    Spring CLI示例快速入门 iii. 10.3. 从Spring Boot早期版本升级 iv. 11. 开发你的第一个Spring Boot应用 v. 11.1. 创建POM vi. 11.2. 添加classpath依赖 vii. 11.3. 编写代码 i. 11.3.1. @RestController和@...

    基于微服务的车票管理系统源码+项目说明+sql数据库.tar

    #### 涉及技术栈:MySQL,Redis,RabbitMQ,MybatisPlus,SpringBoot,SpringCloud,Seata,Sentinel,Gateway,Jsoup,Nginx,Docker *** &gt;管理员样例 &gt;&gt; 账号:wsh &gt;&gt; 密码:wsh &gt;&gt; &gt;普通用户样例 &gt;&gt; 账号:...

Global site tag (gtag.js) - Google Analytics