JMX 是Java 管理扩展(Java Management Extensions);JMX是一种管理和监控系统资源的技术。这种规范为运行管理系统体统了强大的功能。这些资源有托管Bean(managed beans,MBeans)表示。Spring 可以将任何Spring 管理的Bean输出为Mbean,而不需要在该Bean中定义任何JMX特有的属性。可以简单地通过声明一个MbeanExporter实例来完成将普通Bean 导出为Mbean.
- 如果Bean实现了任意一个JMX的管理接口 MBeanExporter可以简单地通过自动检测过程注册服务器的MBean
- 如果Bean没有实现JMX的挂历接口 MBeanExporter通过使用MBeanInfoAssembler创建管理信息
/** *定义一个普通的接口 * * @author zhangwei_david * @version $Id: HiMBean.java, v 0.1 2015年1月24日 下午1:16:15 zhangwei_david Exp $ */ public interface HiMBean { /** *打招呼 */ public void sayHello(); /** * 加法计算器 * * @param x * @param y * @return */ public int add(int x, int y); /** * 获取名称 * * @return */ public String getName(); /** *获取缓存大小 * * @return */ public int getCacheSize(); /** *设置缓存大小 * * @param size */ public void setCacheSize(int size); }
/** *简单实现类 * @author Lenovo * @version $Id: Hi.java, v 0.1 2014年9月26日 下午2:48:09 Lenovo Exp $ */ public class HiMbeanImpl implements HiMBean { private final String name = "Reginald"; private int cacheSize = DEFAULT_CACHE_SIZE; private static final int DEFAULT_CACHE_SIZE = 200; /** * @see com.cathy.demo.jmx.notifications.HiMBean#sayHello() */ public void sayHello() { System.out.println("Hello," + getName()); } /** * @see com.cathy.demo.jmx.notifications.HiMBean#add(int, int) */ public int add(int x, int y) { return x + y; } /** * @see com.cathy.demo.jmx.notifications.HiMBean#getName() */ public String getName() { return name; } /** * @see com.cathy.demo.jmx.notifications.HiMBean#getCacheSize() */ public int getCacheSize() { return cacheSize; } /** * @see com.cathy.demo.jmx.notifications.HiMBean#setCacheSize(int) */ public void setCacheSize(int size) { cacheSize = size; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:task="http://www.springframework.org/schema/task" xmlns:util="http://www.springframework.org/schema/util" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd "> <aop:aspectj-autoproxy /> <context:annotation-config /> <context:component-scan base-package="com.cathy.demo.jmx.*" /> <!-- HiMbean --> <bean id="hiMbean" class="com.cathy.demo.jmx.HiMbeanImpl"/> <bean id="mbeanExporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="beans"> <util:map> <entry key="bean:name=hiMbean" value-ref="hiMbean"/> </util:map> </property> </bean> </beans>
/** * * @author zhangwei * @version $Id: AsyncDemoTest.java, v 0.1 2014年9月26日 下午10:43:43 zhangwei Exp $ */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath*:META-INF/spring/jmx-beans.xml") public class JmxTest { @Test public void testAsync() throws InterruptedException { TimeUnit.HOURS.sleep(1); } }
jconsole的结果:
如果不是用Spring导出一个Mban的化 代码如下:
/** * * @author Lenovo * @version $Id: Main.java, v 0.1 2014年9月26日 下午4:08:31 Lenovo Exp $ */ public class Main { /** * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //获取Mean的平台服务 MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); // 对即将被注册的MBean 构造一个ObjectName ObjectName objectName = new ObjectName("com.cathy.demo.jmx:type=Hi"); // 创建一个Mbean RequiredModelMBean mbean = new RequiredModelMBean(); HiMbeanImpl hiMbean = new HiMbeanImpl(); mbean.setManagedResource(hiMbean, "objectReference"); ModelMBeanAttributeInfo name = new ModelMBeanAttributeInfo("name", "java.lang.String", "userName", true, true, false, new DescriptorSupport(new String[] { "name=name", "descriptorType=attribute", "getMethod=getName", "setMethod=setName" })); ModelMBeanOperationInfo sayHello = new ModelMBeanOperationInfo("say Hello", hiMbean .getClass().getMethod("sayHello")); ModelMBeanOperationInfo getName = new ModelMBeanOperationInfo("get userName", hiMbean .getClass().getMethod("getName")); ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport("HiMbean", "Test", new ModelMBeanAttributeInfo[] { name }, null, new ModelMBeanOperationInfo[] { sayHello, getName }, null); mbean.setModelMBeanInfo(mbeanInfo); // 将Mbean 注册到MBeanServer mbs.registerMBean(mbean, objectName); // 一直等待 System.out.println("Waiting forever..."); Thread.sleep(Long.MAX_VALUE); } }
为远程服务暴露一个Mbean
有时候需要将本地的Mbean暴露出去,供远程调用;在Spring可以使用ConnectorServerFactoryBean创建一个JMX连接服务器。
<bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"/> <bean id="connectorServer" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="rmiRegistry"> <property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:1099/hiMbean"/> </bean>
通过Jconsole 访问远程Mbean
已经为远程服务暴露了Mbean 那么如果在Spring 中远程调用Mbean又是什么样的呢?
<bean id="mbeanServerConnection" class="org.springframework.jmx.support.MBeanServerConnectionFactoryBean"> <property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:1099/hiMbean"/> </bean> <bean id="hiMbeanProxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean"> <property name="server" ref="mbeanServerConnection"/> <property name="objectName" value="bean:name=hiMbean"/> <property name="proxyInterface" value="com.cathy.demo.jmx.HiMBean"/> </bean>
/** * * @author zhangwei * @version $Id: AsyncDemoTest.java, v 0.1 2014年9月26日 下午10:43:43 zhangwei Exp $ */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath*:META-INF/spring/jmx-beans.xml") public class JmxTest { @Autowired private HiMBean hiMbeanProxy; @Test public void testAsync() throws InterruptedException { hiMbeanProxy.sayHello(); TimeUnit.HOURS.sleep(1); } }
结果是:
一月 24, 2015 2:16:34 下午 org.springframework.test.context.TestContextManager retrieveTestExecutionListeners 信息: @TestExecutionListeners is not present for class [class com.cathy.demo.schedule.JmxTest]: using defaults. 一月 24, 2015 2:16:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from URL [file:/H:/Alipay.com/workspace4alipay/demo/target/classes/META-INF/spring/jmx-beans.xml] 一月 24, 2015 2:16:35 下午 org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider registerDefaultFilters 信息: JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 一月 24, 2015 2:16:35 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.GenericApplicationContext@7c703b: startup date [Sat Jan 24 14:16:35 CST 2015]; root of context hierarchy 一月 24, 2015 2:16:35 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@afc191: defining beans [org.springframework.aop.config.internalAutoProxyCreator,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,hiMbean,mbeanExporter,rmiRegistry,connectorServer,mbeanServerConnection,hiMbeanProxy,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy 一月 24, 2015 2:16:35 下午 org.springframework.jmx.export.MBeanExporter afterPropertiesSet 信息: Registering beans for JMX exposure on startup 一月 24, 2015 2:16:35 下午 org.springframework.jmx.export.MBeanExporter registerBeanInstance 信息: Located managed bean 'bean:name=hiMbean': registering with JMX server as MBean [bean:name=hiMbean] 一月 24, 2015 2:16:35 下午 org.springframework.remoting.rmi.RmiRegistryFactoryBean getRegistry 信息: Looking for RMI registry at port '1099' 一月 24, 2015 2:16:36 下午 org.springframework.remoting.rmi.RmiRegistryFactoryBean getRegistry 信息: Could not detect RMI registry - creating new one 一月 24, 2015 2:16:36 下午 org.springframework.jmx.support.ConnectorServerFactoryBean afterPropertiesSet 信息: JMX connector server started: javax.management.remote.rmi.RMIConnectorServer@9d0b9d Hello,Reginald
相关推荐
Spring 提供了`PlatformMBeanServer`的自动配置,可以方便地将Spring Bean暴露为JMX资源。例如,你可以通过`@ManagedResource`注解标记一个类,然后使用`@ManagedAttribute`和`@ManagedOperation`来定义可管理和操作...
3. 使用Spring的JMX支持:Spring提供了`PlatformMBeanServerBeanPostProcessor`,它可以自动检测带有MBean注解的bean并将其注册到MBean服务器。 4. 连接和管理:通过JConsole或其他JMX客户端工具,如VisualVM或JMC...
Spring通过`MBeanServer`接口和`MBeanExporter`类,允许开发者将Spring Bean自动转换为MBeans。 在Spring中配置JMX整合通常涉及以下几个步骤: 1. **启用JMX支持**:在Spring配置文件中,我们需要添加`...
在Spring中,我们可以利用JMX来创建MBeans(Managed Beans),这些MBeans代表了我们的管理对象,可以是服务、配置参数或者其他任何需要管理的实体。 在"JmxTestBean1.xml"这个配置文件中,你可能会看到Spring如何...
Spring通过`MBeanExporter`类将Spring Bean注册到MBean服务器,这些Bean可以是标准的JMX MBean,也可以是自动转换的Spring Bean。此外,Spring还支持自定义的MBean信息,如MBean的名称、描述、属性和操作。 **JMX的...
Spring JMX提供了一种便捷的方式将普通Java对象暴露为MBeans,通过MBeanServer进行管理。 要在Spring应用中使用JMX,首先需要配置MBean。这可以通过两种方式实现:一是使用`@ManagedResource`注解标记一个类,使其...
这个压缩包中的例子很可能是创建了一个简单的Spring应用,并且配置了JMX支持,展示如何将Spring的bean暴露为MBeans进行管理和监控。通过研究这些示例,新人可以更好地理解JMX和Spring如何协同工作,提升他们的Java...
在JMX中,MBean(Managed Bean)是核心概念,它是具有特定管理接口的对象,可以代表任何可管理的资源。 **MBean Server详解** MBean Server是JMX架构的核心,它负责注册、管理和访问MBean。MBean Server就像一个...
第18章 使用JMX监控Spring本章内容:使用Actuator端点的MBean将Spring bean暴露为MBean发布通知JMX(Java Manage
将MX4J与Spring结合,可以充分利用JMX的功能,并借助Spring的便利性来管理和监控应用。 在标题“mx4j管理jmx的jar与spring结合使用”中,我们关注的重点是MX4J如何与Spring协作来实现JMX的功能。MX4J提供的`mx4j-...
在实际应用中,JMX常用于监控复杂的系统和服务,如Spring框架就利用JMX暴露其内部管理接口。例如,你可以通过JMX监控和调整Spring应用上下文中的bean。 **5. 结论** JMX为Java开发者提供了一种强大且灵活的工具,...
总的来说,《JMX in Action》是一本全面且深入的JMX教程,它不仅涵盖了JMX的基础知识,还提供了丰富的实践案例和实战经验,帮助读者将理论知识转化为实际操作能力。通过学习这本书,读者可以有效地利用JMX提升Java...
MBean(Managed Bean)是JMX中的核心概念,它代表了管理的对象,可以是系统的一个组件、服务或者任何需要被管理的资源。 2. `jmx_remote-1_0_1_03-ri.zip`: 这个文件包含了JMX的远程访问支持。JMX远程接口允许管理...
Spring的`@ManagedResource`注解可以自动将bean暴露为MBean,而`@ManagedAttribute`和`@ManagedOperation`可以分别标记可管理的属性和操作。 9. **JMX与OSGi的集成**:在OSGi环境中,可以通过实现特定的服务接口...
7. **JMX与Spring的集成**:Spring框架提供了与JMX的集成,可以方便地将Spring Bean注册为MBeans,简化了JMX的使用。 8. **安全性**:JMX支持安全管理,可以通过设置权限来控制哪些客户端可以访问特定的MBeans,...
12.4.1 将Spring Bean输出为MBean 12.4.2 远程访问MBean 12.4.3 处理通知 12.5 小结 第三部分 Spring客户端 第13章 处理Web请求 13.1 开始Spring MVC之旅 13.1.1 请求生命中的一天 13.1.2 配置...
首先,MBean(Managed Bean)是JMX的核心组件之一,它是被管理资源的实例。MBean提供了对外界暴露的一系列方法和属性,使得管理者能够获取资源状态并进行操控。MBean有四种类型:标准MBean、动态MBean、开放MBean和...
4. **Model MBean**:是Dynamic MBean的一种增强,它提供了一种模型化的方式,允许将任何Java对象封装为MBean,而无需直接实现`DynamicMBean`接口。Model MBean通过实现`javax.management.modelmbean.ModelMBeanInfo...
MBean就像Java Bean一样,包含属性和方法,用于暴露被管理资源的状态并允许外部操作。 JMX架构主要包括以下几个组件: 1. **MBean**: MBean是JMX的核心,它是被管理的对象,可以是系统配置、JVM指标或者其他特定...