Spring+JMX(Java Management Extensions)

Spring应用中的JMX集成实战 为了将Spring Bean暴露为JMX MBean,我们需要使用Spring提供的和注解。 阅读详情

基于J2SE 6来学习JMX。
目的:
JMX已经成功Java 2平台的一部分,它的目标是动态管理和监控你所感兴趣的资源,例如应用程序、设备、服务、JVM等,JMX能够支持通过本地和远程访问的方式,来实现对相关资源的管理和监控。

好处:
第一、基于JMX来管理现有的Java应用程序,可以非常容易的基于Java技术实现,而无需更大的投入;
第二、JMX定义了一种规范和一组标准API,业界已经将JMX技术纳入到自己的产品中来,例如JBoss、Weblogic等;
第三、JMX具有一套标准的架构,使得在管理方面具备动态性、灵活性、可扩展性和稳定性;
第四、JMX可以非常容易地与其他管理方案进行整合,如通过浏览器来访问代理服务器(MBean Server)。
JMX技术框架可以分为三层:设备层、代理层、远程管理层,下面分别介绍:

设备层:
这一层定义了需要管理的资源,如应用程序、设备、服务、网络,将这些资源以Java对象的形式,以MBean的方式暴露管理接口,例如标准MBean,通过定义名称含有MBean后缀的管理接口,在实现这些接口时与待管理的资源相关联,之后将这些Java对象注册到代理服务器(MBean Server)来实现远程管理和监控。
需要注意的是,对于标准MBean,如果MBean管理接口定义为xxxMBean,则实现一定为xxx,否则就无法通过MBean Server查找到对应的资源。
代理层:
代理层为待管理对象(如实现标准MBean管理接口的Java对象)提供了一个容器,其中只有满足要求并注册到容器中对象才能实现JMX管理。代理层最主要的组件就是MBean Server,它在我们的应用系统中充当一个管理功能的代理。
JavaSE 6平台中,可以通过调用ManagementFactory.getPlatformMBeanServer()来获取到一个MBean Server,然后向其中注册实现好的MBean资源,就能够通过JMX进行管理。查找本地的MBean Server(如果没有找到,会自动创建一个),有关如何查找以及可能需要创建,可以通过ManagementFactory.getPlatformMBeanServer()的代码来实现跟踪。在启动参数中,需要设置-Dcom.sun.management.jmxremote选项,表示可以通过远程进行管理。

远程管理层:
我们要管理应用系统的某些资源,是通过代理层来间接实现管理,那么在与代理层之间交互最为直接,所以远程远程管理层定义了我们通过什么方式来与MBean Server进行交互,如基于何种协议、怎样建立连接才能通过远程手段在MBean Server的JVM之外进行访问,从而实现管理和监控,例如基于JMXMP、RMI等。
所以,远程管理层最重要的两个组件就是协议适配器和连接器。Sun公司实现了一个基于JMXMP协议的工具JConsole,可以通过JConsole来方便地进行调试。启动JConsole后,可以通过本地进程或远程进程来进行远程管理。
创建一个基于RMI协议的连接器,示例如下:

String serviceURL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
  JMXServiceURL url = new JMXServiceURL(serviceURL);
  JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbeanServer);

 

Spring与JMX集成,实现方式灵活而且简单,主要体现在:

1、可以自动探测实现MBean接口的MBean对象,而且可以将一个普通的Spring Bean注册为MBean;

2、定制管理MBean的接口,根据需要暴露特定管理MBean的操作;

3、使用注解定义MBean管理接口;

4、可以实现对本地和远程MBean的代理。

 

标准MBean管理

对于实现标准MBean接口MBean资源,在Spring中可以设置不同的探测模式,主要是通过MBeanExporter来实现。例如,定义MBean管理接口:

  1. package org.shirdrn.spring.jmx.autodetect;  
  2.   
  3. public interface MyObjectMBean {  
  4.     public long getId();  
  5.     public void setId(long id);  
  6.     public String getName();  
  7.     public void setName(String name);  
  8.     public String show();  
  9. }  

对应的MBean实现,如下所示:

  1. package org.shirdrn.spring.jmx.autodetect;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5. public class MyObject implements MyObjectMBean {  
  6.       
  7.     private static final Logger LOG = Logger.getLogger(MyObject.class);  
  8.     private long id;  
  9.     private String name;  
  10.       
  11.     public MyObject() {  
  12.         super();  
  13.     }  
  14.       
  15.     public MyObject(long id, String name) {  
  16.         super();  
  17.         this.id = id;  
  18.         this.name = name;  
  19.     }  
  20.   
  21.     public long getId() {  
  22.         return id;  
  23.     }  
  24.   
  25.     public void setId(long id) {  
  26.         this.id = id;  
  27.     }  
  28.   
  29.     public String getName() {  
  30.         return name;  
  31.     }  
  32.   
  33.     public void setName(String name) {  
  34.         this.name = name;  
  35.     }  
  36.   
  37.     public String show() {  
  38.         StringBuffer sb = new StringBuffer().append("id=").append(id).append(  
  39.                 ", name=").append(name);  
  40.         LOG.info("show()=" + sb.toString());  
  41.         return sb.toString();  
  42.     }  
  43. }  

上面是一个标准MBean的实现,可以使用JavaSE 6平台的JMX服务来管理,但是在Spring集成的环境下,也可以重用这些MBean实现,例如下面是一个典型的配置:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  6.     <bean id="mbServer" class="org.springframework.jmx.export.MBeanExporter">  
  7.         <property name="autodetectModeName">  
  8.             <value>AUTODETECT_ALL</value>  
  9.         </property>  
  10.     </bean>  
  11.     <bean name="mydomain:myobj=MyObjectMBean" class="org.shirdrn.spring.jmx.autodetect.MyObject">  
  12.         <property name="id">  
  13.             <value>90000000001</value>  
  14.         </property>  
  15.         <property name="name">  
  16.             <value>shirdrn</value>  
  17.         </property>  
  18.     </bean>  
  19. </beans>  

上面配置中,MBeanExporter会查找本地MBean Server,指定的探测模式autodetectModeName为AUTODETECT_ALL,这也是MBeanExporter的默认值(这个属性完全可以省略,不用配置),无需手动向MBean Server进行注册,便能管理配置的MBean对象“mydomain:myobj=MyObjectMBean”。

对于探测模式autodetectModeName属性,Spring提供了4个取值:

AUTODETECT_NONE           不启用自动探测,需要手动向MBean Server进行注册,即通过MBeanExporter的beans属性进入注册;

AUTODETECT_MBEAN         在当前IOC容器中进行查找MBean组件;

AUTODETECT_ASSEMBLER  设置根据MBeanInfoAssembler的策略进行探测;

AUTODETECT_ALL               自动探测,是AUTODETECT_MBEAN和AUTODETECT_ASSEMBLER的并集。

另外,Spring的MBeanExporter也提供了autodetect属性,取值为true和false,指定对MBean组件的探测行为。

 

普通Spring Bean管理

对于一个普通的Spring Bean,也可以作为MBean来进行管理,Spring可以很好地支持。如下面一个普通的Java类:

  1. package org.shirdrn.spring.jmx;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5. public class MyJavaObject {  
  6.   
  7.     private static final Logger LOG = Logger.getLogger(MyJavaObject.class);  
  8.     private long id;  
  9.     private String name;  
  10.   
  11.     public MyJavaObject() {  
  12.         super();  
  13.     }  
  14.   
  15.     public MyJavaObject(long id, String name) {  
  16.         super();  
  17.         this.id = id;  
  18.         this.name = name;  
  19.     }  
  20.   
  21.     public long getId() {  
  22.         return id;  
  23.     }  
  24.   
  25.     public void setId(long id) {  
  26.         this.id = id;  
  27.     }  
  28.   
  29.     public String getName() {  
  30.         return name;  
  31.     }  
  32.   
  33.     public void setName(String name) {  
  34.         this.name = name;  
  35.     }  
  36.   
  37.     public String show() {  
  38.         StringBuffer sb = new StringBuffer().append("id=").append(id).append(  
  39.                 ", name=").append(name);  
  40.         LOG.info("show()=" + sb.toString());  
  41.         return sb.toString();  
  42.     }  
  43. }  

它并没有实现MBean管理接口,可以通过MBeanExporter的beans属性进行注册,配置如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  6.     <bean id="mbServer" class="org.springframework.jmx.export.MBeanExporter">  
  7.         <property name="beans">  
  8.             <map>  
  9.                 <entry key="mydomain:myjavaobj=MyJavaObject" value-ref="myobj"/>  
  10.             </map>  
  11.         </property>  
  12.     </bean>  
  13.     <bean name="myobj" class="org.shirdrn.spring.jmx.MyJavaObject">  
  14.         <property name="id">  
  15.             <value>90000000001</value>  
  16.         </property>  
  17.         <property name="name">  
  18.             <value>shirdrn</value>  
  19.         </property>  
  20.     </bean>  
  21. </beans>  

因为org.shirdrn.spring.jmx.MyJavaObject没有对应的MBean接口,所以默认情况下,该类中public的成员都会暴露出来,通过MBean Server可以管理。实际上,系统中MBean的某些属性或方法可能不需要暴露给外部进行管理,为了克服这种缺点,Spring提供了基于方法列表和接口定制的功能,可以将你所感兴趣的属性或方法暴露给外部管理。

 

基于方法列表和接口定制的MBean管理

对于上述普通的Java类MyJavaObject,可以通过定制接口和方法列表,来暴露MBean属性或方法。例如,一个方法列表,可以在进行配置的时候指定,如下所示:

  1. <bean id="assembler" class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler">  
  2.     <property name="managedMethods"  value="setId,setName,show" />  
  3. </bean>  

上面通过org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler来进行方法列表的设置。而对于接口,可以定义一个接口,如下所示:

  1. package org.shirdrn.spring.jmx.selected.interfaces;  
  2.   
  3. public interface SelectedMethodsInterface {  
  4.     public long setId(long id);  
  5.     public void setName(String name);  
  6.     public void show();  
  7. }  

Spring配置,如下所示:

  1. <bean id="assembler" class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">  
  2.     <property name="managedInterfaces">  
  3.         <list>  
  4.             <value>org.shirdrn.spring.jmx.selected.interfaces.SelectedMethodsInterface</value>  
  5.         </list>  
  6.     </property>  
  7. </bean>  

上面通过org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler,可以设置一个接口列表,来管理MBean暴露的接口。

对于上面两种方式,都得到一个assembler实例,需要将其注入到org.springframework.jmx.export.MBeanExporter中,如下所示:

  1. <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">  
  2.     <property name="beans">  
  3.         <map>  
  4.             <entry key="mydomain:javaObj=MyJavaObject" value-ref="javaObject" />  
  5.         </map>  
  6.     </property>  
  7.     <property name="assembler" ref="assembler" />  
  8. </bean>  

 

基于注解的MBean管理

对于一个普通的Java类,作为MBean需要被管理,可以通过注解指定要暴露的属性和方法,示例如下:

  1. package org.shirdrn.spring.jmx.annotation;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.springframework.jmx.export.annotation.ManagedAttribute;  
  5. import org.springframework.jmx.export.annotation.ManagedOperation;  
  6. import org.springframework.jmx.export.annotation.ManagedResource;  
  7.   
  8. @ManagedResource(objectName = "annojmx:myjao=AnnotationObject", description = "MyJavaAnnotationObject")  
  9. public class MyJavaAnnotationObject {  
  10.       
  11.     private static final Logger LOG = Logger.getLogger(MyJavaAnnotationObject.class);  
  12.     private long id;  
  13.     private String name;  
  14.   
  15.     public MyJavaAnnotationObject() {  
  16.         super();  
  17.     }  
  18.   
  19.     public MyJavaAnnotationObject(long id, String name) {  
  20.         super();  
  21.         this.id = id;  
  22.         this.name = name;  
  23.     }  
  24.   
  25.     @ManagedAttribute  
  26.     public long getId() {  
  27.         return id;  
  28.     }  
  29.   
  30.     public void setId(long id) {  
  31.         this.id = id;  
  32.     }  
  33.   
  34.     public String getName() {  
  35.         return name;  
  36.     }  
  37.   
  38.     @ManagedAttribute  
  39.     public void setName(String name) {  
  40.         this.name = name;  
  41.     }  
  42.   
  43.     @ManagedOperation  
  44.     public String show() {  
  45.         StringBuffer sb = new StringBuffer().append("id=").append(id).append(  
  46.                 ", name=").append(name);  
  47.         LOG.info("show()=" + sb.toString());  
  48.         return sb.toString();  
  49.     }  
  50. }  

上面@ManagedResource表示指定该类的实例作为MBean注册到MBean Server中,然后可以通过对属性和方法分别使用@ManagedAttribute和@ManagedOperation来指定暴露的属性和方法。有关这些注解的详细内容,可以查阅相关文档。

下面是一个基本的配置内容:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  5.     <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">  
  6.         <property name="assembler" ref="assembler" />  
  7.         <property name="namingStrategy" ref="namingStrategy" />  
  8.     </bean>  
  9.     <bean id="assembler"  
  10.         class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">  
  11.         <property name="attributeSource" ref="jmxas" />  
  12.     </bean>  
  13.     <bean id="namingStrategy"  
  14.         class="org.springframework.jmx.export.naming.MetadataNamingStrategy">  
  15.         <property name="attributeSource" ref="jmxas" />  
  16.     </bean>  
  17.     <bean id="jmxas" class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />  
  18.     <bean id="javaObj"  
  19.         class="org.shirdrn.spring.jmx.annotation.MyJavaAnnotationObject">  
  20.         <property name="id" value="201122121200" />  
  21.         <property name="name" value="shirdrn" />  
  22.     </bean>  
  23. </beans>  

上面使用了Spring的MBeanExporter,可以看到,Spring配置内容相对较多。

Spring还提供两种简化配置的方式,

一种是,提供了org.springframework.jmx.export.annotation.AnnotationMBeanExporter,可以将上述配置大大简化,等价的配置如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  5.     <bean class="org.springframework.jmx.export.annotation.AnnotationMBeanExporter"/>  
  6.     <bean name="myAnnoObject"  
  7.         class="org.shirdrn.spring.jmx.annotation.MyJavaAnnotationObject">  
  8.         <property name="id" value="201122121200" />  
  9.         <property name="name" value="shirdrn" />  
  10.     </bean>  
  11. </beans>  

另一种是,提供了<context:mbean-export />标签,更加简洁,等价的配置如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  5.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  6.         http://www.springframework.org/schema/context   
  7.         http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  8.     <context:mbean-export registration="failOnExisting" />  
  9.     <bean name="myAnnoObject"  
  10.         class="org.shirdrn.spring.jmx.annotation.MyJavaAnnotationObject">  
  11.         <property name="id" value="201122121200" />  
  12.         <property name="name" value="shirdrn" />  
  13.     </bean>  
  14. </beans>  

 

通过远程代理访问MBean

根据JavaSE 6平台的JMX技术架构定义,分为设备层、代理层、远程管理层这三层,我们通过可以使用Spring提供的org.springframework.jmx.access.MBeanProxyFactoryBean实现,定义代理,来访问MBean Server管理MBean资源。实际上,Spring提供的这个代理功能位于JMX架构的远程管理层,那么在代理层和远程管理层之间,要定义连接器,才能通过远程管理层访问到代理层的MBean Server组件。下面通过实例来实现:

首先,定义个普通的Java类,作为待管理的MBean,如下所示:

  1. package org.shirdrn.spring.jmx.rmi;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5. public class MyJavaObject {  
  6.       
  7.     private static final Logger LOG = Logger.getLogger(MyJavaObject.class);  
  8.     private long id;  
  9.     private String name;  
  10.   
  11.     public MyJavaObject() {  
  12.         super();  
  13.     }  
  14.   
  15.     public MyJavaObject(long id, String name) {  
  16.         super();  
  17.         this.id = id;  
  18.         this.name = name;  
  19.     }  
  20.   
  21.     public long getId() {  
  22.         return id;  
  23.     }  
  24.   
  25.     public void setId(long id) {  
  26.         this.id = id;  
  27.     }  
  28.   
  29.     public String getName() {  
  30.         return name;  
  31.     }  
  32.   
  33.     public void setName(String name) {  
  34.         this.name = name;  
  35.     }  
  36.   
  37.     public String show() {  
  38.         StringBuffer sb = new StringBuffer().append("id=").append(id).append(  
  39.                 ", name=").append(name);  
  40.         LOG.info("show()=" + sb.toString());  
  41.         return sb.toString();  
  42.     }  
  43. }  

其次,定义了一个Java接口,来按需暴露操作MBean资源的方法:

  1. package org.shirdrn.spring.jmx.rmi;  
  2.   
  3. public interface MyManagedInterfaces {  
  4.     public long setId(long id);  
  5.     public String getName();  
  6.     public String show();  
  7. }  

再次,看一下我们模拟代理层Spring配置server.xml内容:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  5.     <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">  
  6.         <property name="beans">  
  7.             <map>  
  8.                 <entry key="mydomain:myjavaobj=MyJavaObject" value-ref="myJavaObj" />  
  9.             </map>  
  10.         </property>  
  11.         <property name="assembler" ref="assembler" />  
  12.     </bean>  
  13.     <bean id="assembler"  
  14.         class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">  
  15.         <property name="managedInterfaces">  
  16.             <list>  
  17.                 <value>org.shirdrn.spring.jmx.rmi.MyManagedInterfaces</value>  
  18.             </list>  
  19.         </property>  
  20.     </bean>     
  21.     <bean name="myJavaObj" class="org.shirdrn.spring.jmx.rmi.MyJavaObject">  
  22.         <property name="id" value="88000000001" />  
  23.         <property name="name" value="shirdrn" />  
  24.     </bean>  
  25.     <bean id="server" class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="registry">  
  26.         <property name="objectName">  
  27.             <value>connector:name=rmi</value>  
  28.         </property>  
  29.         <property name="serviceUrl">  
  30.             <value>service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmxrmi</value>  
  31.         </property>  
  32.     </bean>  
  33.     <bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">  
  34.         <property name="port">  
  35.             <value>1099</value>  
  36.         </property>  
  37.     </bean>  
  38. </beans>  

上半部分配置已经非常熟悉,就是将MBean注册到MBean Server中。下半部分是有关连接器的配置,它是基于RMI协议来进行适配,通过Spring提供的org.springframework.jmx.support.ConnectorServerFactoryBean来实现器,这样,远程管理层可以连接到启动的连接服务器,来访问MBean资源。

然后,我们启动MBean Server及其连接服务器,代码如下所示:

  1. package org.shirdrn.spring.jmx.rmi;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class Server {  
  7.       
  8.     private static final Logger LOG = Logger.getLogger(Server.class);  
  9.       
  10.     public static void main(String[] args) throws Exception {  
  11.         new ClassPathXmlApplicationContext("org/shirdrn/spring/jmx/rmi/server.xml");  
  12.         LOG.info("Server started.");  
  13.           
  14.         Object lock = new Object();  
  15.         synchronized (lock) {  
  16.             lock.wait();  
  17.         }  
  18.     }  
  19. }  

启动后,我们定义的MBean已经注册到本地MBean Server中,同时启动了连接器,监听1099端口。

接着,我们定义远程访问层的Spring配置proxy.xml内容,如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  5.     <bean id="proxy" class="org.springframework.jmx.access.MBeanProxyFactoryBean">  
  6.         <property name="connectOnStartup" value="true" />  
  7.         <property name="objectName" value="mydomain:myjavaobj=MyJavaObject" />  
  8.         <property name="proxyInterface">  
  9.             <value>org.shirdrn.spring.jmx.rmi.MyManagedInterfaces</value>  
  10.         </property>  
  11.         <property name="serviceUrl">  
  12.             <value>service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmxrmi</value>  
  13.         </property>  
  14.     </bean>  
  15. </beans>  

最后,启动代理,访问MBean资源,代码如下所示:

  1. package org.shirdrn.spring.jmx.rmi;  
  2.   
  3. import org.apache.log4j.Logger;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. public class Proxy {  
  8.       
  9.     private static final Logger LOG = Logger.getLogger(Proxy.class);  
  10.       
  11.     public static void main(String[] args) throws Exception {  
  12.         ApplicationContext ctx = new ClassPathXmlApplicationContext(  
  13.                 "org/shirdrn/spring/jmx/rmi/proxy.xml");  
  14.         LOG.info("Proxy server started.");  
  15.         MyManagedInterfaces proxy = (MyManagedInterfaces) ctx.getBean("proxy");  
  16.         String message = proxy.show();  
  17.         LOG.info("proxy.show() = " + message);  
  18.           
  19.         Object lock = new Object();  
  20.         synchronized (lock) {  
  21.             lock.wait();  
  22.         }  
  23.     }  
  24. }  

这里,只能访问通过org.shirdrn.spring.jmx.rmi.MyManagedInterfaces接口定义的方法来操作注册到MBean Server中的MBean资源。


 

【Spring】SpringBoot 如何使用JMX 在:【Spring】Spring 如何更改动态更改运行中某个类的日志级别中最后一张图中,可以看到程序员高手是使用JMX来操作动态修改日志级别的,下面我们就来试试。 阅读详情

相关推荐

39、Spring中JMX管理与配置外部化

本文详细介绍了Spring框架中的多种高级功能,包括通过JMX管理Bean、配置外部化到属性文件、JNDI资源的配置、邮件发送功能的实现、任务调度以及异步方法的使用。通过这些技术,开发者可以更加灵活高效地构建和管理Spring应用。

grpc6streamer的博客 128

Spring 与JMX

一、JMX Spring对DI的支持是通过在应用中配置bean属性,这是一种非常不错的方法。不过,一旦应用已经部署并且正在运行,单独使用DI并不能帮助我们改变应用的配置。假设我们希望深入了解正在运行的应用并要在运行时改变应用的配置,此时,就可以使用Java管理扩展(JavaManage- ment Extensions,JMX)了。 JMX这项技术能够让我们管理、监视和配置应用。这项技术最初作为...

书香水墨 4502

【jmx】JMX最佳实践与详解

1.概述 转载:https://www.iteye.com/blog/shift-alt-ctrl-2404103 2.JMX最佳实践 1、Object Names(对象命名) 每个JMX MBean都需要一个“Object Name”,选择一个始终一致的、可用的Object Names将是非常重要的;客户端与你的对象模型(model)交互时,或许是直接将它展示且可读,比如jconsole;或者它被应用程序使用Object Names直接访问你声明的对象模型。所以,在多个models之间,MBean的对象.

九师兄 2766

java jmx教程_集成JMX

在Spring中,可以方便地集成JMX。那么第一个问题来了:什么是JMX?JMX是Java Management Extensions,它是一个Java平台的管理和监控接口。为什么要搞JMX呢?因为在所有的应用程序中,对运行中的程序进行监控都是非常重要的,Java应用程序也不例外。我们肯定希望知道Java应用程序当前的状态,例如,占用了多少内存,分配了多少内存,当前有多少活动线程,有多少休眠线程等...

weixin_28717411的博客 1052

从仿真曲线到电路状态:用Cadence Virtuoso深度剖析CS放大器各个工作区(以电流源负载为例)

本文通过Cadence Virtuoso平台,深入剖析电流源负载CS放大器在不同工作区的表现,从仿真曲线解读电路状态。详细介绍了如何通过Vout-Vin直流扫描曲线判断MOS管工作区域(截止区、饱和区、线性区),并验证理论与仿真的一致性,提升模拟IC设计调试效率。

weixin_30940783的博客 442

Ubuntu20.04运行Vins-fusion

因已安装ROS noetic,eigen,opencv及ceres等库,这部分环境配置就不细讲,直接下载VINS-FUSION的代码库 下载编译 cd ~/vins-fusion/src git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git cd ../ catkin_make source ~/catkin_ws/devel/setup.bash 编译时会发现一堆错误,别急,无非就是环境冲突问题,一个个解决 1)首先,ROS

xiaojinger_123的博客 1万+

java jmx整合Spring配置

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springfram

huhuxiaomomo的博客 562

NGSIM数据集字段解析:从车辆轨迹到交通行为分析

本文深度解析NGSIM数据集的核心字段及其在交通行为分析中的应用。详细解读了车辆时空定位、状态属性及交互关系等关键字段,并通过高速路“幽灵堵车”和城市路口左转行为两个实战案例,展示了如何利用该数据集进行微观交通行为建模与驾驶特征提取,为交通流研究和自动驾驶算法测试提供数据基础。

weixin_29172963的博客 146

JMX中的Mbean监控

​是一个为Java应用程序植入管理功能的框架。‌它允许开发者通过动态地把管理的属性和操作分配给Java对象,‌从而把他们的应用程序和存在的网络管理软件集成在一起。‌JMX为Java开发者定义了一个方法,‌使得开发者能够将独立的Java管理模块集成到存在的管理系统中。‌这种集成使得Java应用程序能够被有效地监控和管理,‌从而提高了系统的可管理性和可维护性。‌。

qq_28036897的博客 563

OneNET物联网平台实战:从零搭建到双向数据通信测试

本文提供了一份详细的OneNET物联网平台实战指南,从零开始讲解平台搭建与设备创建,并重点演示了如何通过MQTT协议实现设备数据上报与云端命令下发的双向数据通信测试。通过模拟设备连接与数据交互,帮助开发者快速理解物联网核心通信流程。

weixin_29306571的博客 350

深入解析Xilinx IDELAYE2在FPGA时序优化中的关键作用与实战配置

本文深入解析了Xilinx FPGA中IDELAYE2模块在时序优化中的关键作用。作为精密的信号延时微调器,IDELAYE2通过可编程的抽头延迟,有效解决高速接口中数据与时钟的相位偏差问题。文章详细阐述了其必须与IDELAYCTRL配对使用的核心机制,并对比分析了FIXED、VARIABLE和VAR_LOAD三种工作模式的实战配置方法与代码示例,为FPGA工程师提供了解决时序收敛难题的关键硬件配置指南。

pear55的博客 1183

spring jmx客户端 和服务端配置

服务端 <bean id="connectorServer" class="org.springframework.jmx.support.ConnectorServerFactoryBean" > 客户端 $

稻香的专栏 1094

SerDes系列之码间干扰的概念

码间干扰出现在传输介质或者元器件的带宽小于所发送的信号带宽时,从时域角度来看,传输路径的带宽限制会使发送信号的上升沿的变化速率变慢,有可能对信号造成高频衰减,并影响到实际数字逻辑电平的转换时序。

一只豌豆象的博客 3464

SpringBoot JMX 实现监控业务数据

一、JMX介绍 1、简介 JMX的全称为Java Management Extensions,是管理Java的一种扩展。这种机制可以方便的管理正在运行中的Java程序。常用于管理线程,内存,日志Level,服务重启,系统环境等。 2、架构图 Instrumentation层: 该层定义了如何实现JMX管理资源的规范。一个JMX管理资源可以是一个Java应用、一个服务或一个设备,它们可以用Java...

qq_36109069的博客 1661

【人工智能之深度学习】18. 金融风控实战:TCN时序卷积网络构建信用卡欺诈实时检测系统

摘要:信用卡欺诈交易识别是金融风控的核心环节,其面临欺诈样本占比低(仅0.1%)、实时响应要求高(毫秒级)等挑战。本文基于IEEE-CIS公开数据集,构建基于时序卷积网络(TCN)的欺诈检测系统,通过捕捉用户交易行为的时序模式识别异常。详细阐述全流程:从数据预处理(构造交易序列特征)、TCN模型设计(轻量级架构适配实时场景),到实时检测部署(异步处理确保低延迟)。实验显示,该系统精确率达63%、召回率89%,误杀率仅0.2%,推理延迟8ms,较XGBoost等传统模型性能显著提升。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1128

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Spring JMX demo 例子

xml version="1.0" encoding="UTF-8"?> beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/sche

TopLevelN的博客 274

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

spring与jmx

spring与jmx 博客分类: Java SpringBean配置管理应用服务器网络协议 JMX应该说是关于网络应用管理的的框架,如果你开发了一个比较复杂的系统,无疑你要提供这个系统的自身管理 系统,JMX更多应用是体现在Server...

chihao4686的博客 206

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

从JMX 谈系统监控

参考:http://www.mengxiansheng.net/index.php/archives/66 jmx介绍: http://en.wikipedia.org/wiki/Java_Management_Extensions 写道写道 Java Management Extensions (JMX) is a Java technology that supplies tools ...

jboss123的专栏 209

JMX应用场景

概念 JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。 有什么用? JMX应用场景 1.开发中如何使用 <dependency> <groupId>org.springframework.boot</groupId> <art

cs_coding的博客 461

服务器开启JMX监控

JMX是一个框架,提供了一种功能,可以实时查询应用程序中通过JMX向外部公布的相应参数或者是其他应用程序,同时也可以通过JMX来实时地调用应用程序使用JMX向外部公布的接口,来完成一些功能操作。   如果想要对远程服务器的进程进行监控,需要在服务器进行相关设置,启动守护进程。如果想进一步定制自己的MXBean,可以考虑在应用程序中registerMXBean,当然在web应用中也可以借助Spr

clamaa的专栏 3084

JMX学习总结(代码)

Server端代码:   MBeanServer mbeanServer = getMBeanServer(); //MyNotification MyNotificationMBean mbean = new MyNotification(); ObjectName notiObjectName = new ObjectName("com.travelsky.com:na...

程序员的天堂 846

Spring开发系列教程(31)——集成JMX

JMX是Java平台的标准管理和监控接口,用于获取JVM和应用程序的运行状态。Spring通过@EnableMBeanExport注解可自动注册MBean,开发者只需编写带有@ManagedResource注解的管理类即可暴露监控接口。示例展示了通过JMX动态管理IP黑名单的功能:使用jconsole工具实时添加/移除黑名单IP,并通过拦截器实现访问控制。JMX还可用于收集性能数据,配合监控系统实现运维管理。该技术为Java应用提供了标准化的管理和监控方案。

彩蛋在每篇文章的最后名片 439

JMX with Spring

[code="java"] import java.util.Date; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; impor...

iteye_11231的博客 169

基于JMX进行项目配置管理

JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。 应用场景有很多,其中就有配置管理,其他的应用场景可以自行百度,别的什么概念就不多说了。 下面程序一列就知道JMX是个什么东西了。 撸代码: 一:基于JConsole管理 项目所需建的类

菜 头笔记 1111

JMX Usage

holdorph's blog is very good! link: http://www.unicon.net/node/614 About JMX Actually, if you go to C:\COMET-DEV\workspaces\COES\config\quantum\cash\AP\dev\cash_coes_sls1, which is the config folder f...

tomboxfan 112
上一篇: Spring 单元测试和集成测试
下一篇: Spring+JCA(J2EE Connector Architecture)J2EE连接器架构 简单介绍
努力突破
博客等级 码龄17年 36粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值