这篇文章主要是结合实际应用的情况对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则是在系统运行时动态注册的。
分享到:
相关推荐
本教程将引导你入门Spring框架下的JMX应用。 首先,JMX是一种Java标准,它允许开发者创建可管理的Java组件,并提供了一种统一的方式来管理和监控这些组件。在Spring中,我们可以利用JMX来创建MBeans(Managed Beans...
第一章 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快速入门 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的事务管理、安全性以及对其他技术(如JMS、JMX)的支持,使得它成为企业级应用的首选框架。 **整合Struts、Hibernate和Spring**: 这三大框架的整合被称为SSH(Struts、Spring、Hibernate)集成,...
为什么JMX那么受欢迎,JMX到底有那些优势只得人们去学习和理解,本文从JMX的基本架构、hellowold jmx以及spring对JMX的支持讲起,希望大家能通过本文对JMX有个基础的认识,并能通过本文为今后学习JMX打个基础
第一章 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使得开发者能够轻松地添加管理功能,同时,由于它的灵活性,可以与各种管理工具和框架(如Spring)集成,提升整体系统的可管理性和可维护性。 总的来说,JMX是Java世界中一个强大的工具,用于构建可管理和可监控...
Java Management Extensions(JMX)是...例如,Spring框架提供了对JMX的集成支持,简化了在Spring应用中使用JMX的复杂性。总的来说,JMX因其灵活性、标准化和广泛的生态系统支持,成为了Java环境中不可或缺的管理工具。
Spring框架由多个模块组成,这些模块包括核心容器(Core Container,如Core和Beans模块)、AOP模块、设备支持(Instrumentation)、数据访问/集成(如JDBC、ORM和JMX模块)、Web模块(如Spring MVC和WebSocket)、...
2. **Data Access/Integration**:这部分涵盖了数据库访问和集成,如JDBC抽象层、ORM(对象关系映射)支持,如Hibernate、MyBatis等,以及JPA(Java Persistence API)和JMX(Java Management Extensions)的支持。...
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 查看初始化的...
**SpringBoot基础入门** SpringBoot是由Pivotal团队提供的全新框架,其设计目标是用来简化Spring应用的初始搭建以及开发过程。它集成了大量的常用组件,提供了自动配置的"starter"项目对象模型(POM),使得开发者...
- **入门**:介绍了如何使用Spring Data MongoDB的反应式支持。 - **连接MongoDB**:通过Spring框架和反应式驱动程序连接MongoDB的方法。 - **ReactiveMongoTemplate**:类似于MongoTemplate,但专注于反应式编程...
6. **与其他开源技术的集成**:Spring框架可以轻松集成其他流行的技术,如 Quartz 定时任务、Quartz Spring、JMS、JMX等,为开发者提供了一站式的解决方案。 在《Spring4 中文版》这份文档中,你将深入了解到如何...
历史,设计理念,反馈,入门。 核心 IoC容器,事件,资源,i18n,验证,数据绑定,类型转换,SpEL,AOP。 测试 模拟对象,TestContext框架,Spring MVC测试,WebTestClient。 资料存取 事务,DAO支持,JDBC,O / ...
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 Boot 并不试图覆盖所有 Spring 功能,而是为最常见的用例提供一个更快、更便捷的入门途径。 1. **起步依赖(Starters)** Spring Boot 的核心特性之一是起步依赖。这些预定义的 Maven 或 Gradle 依赖组合,...
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框架入门与基础知识 #### 引言 Spring框架是一款为简化企业级应用程序开发而设计的开源框架。它提供了一套全面的编程和配置模型,支持多种应用开发场景,包括Web应用、移动应用以及传统的服务器端应用等...
在入门指南部分,文档可能提供了如何开始使用Spring Framework的基础知识,包括一些基础概念和必要的配置,帮助新手快速上手。 接着,在介绍Spring框架的章节中,文档可能介绍了Spring的整体架构,包括它的各种模块...