Spring与JMX集成,实现方式灵活而且简单,主要体现在:
1、可以自动探测实现MBean接口的MBean对象,而且可以将一个普通的Spring Bean注册为MBean;
2、定制管理MBean的接口,根据需要暴露特定管理MBean的操作;
3、使用注解定义MBean管理接口;
4、可以实现对本地和远程MBean的代理。
初探学习:
public class HusbandLocal { // 属性 private String name; private int age; private String message; // set,get public String getName() { System.out.println("name:"+name); return name; } public void setName(String name) { this.name = name; } public int getAge() { System.out.println("age:"+age); return age; } public void setAge(int age) { this.age = age; } public String getMessage() { System.out.println("message:"+message); return message; } public void setMessage(String message) { this.message = message; } // 额外的操作,方法 public void call(String message) { System.out.println("丈夫的call:" + message); } public void look(){ System.out.println("发现发廊"); } public void playDOTA(){ System.out.println("这个不用解释了吧~DOTA"); } }
<?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/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 暴露监控设备 --> <bean id="exporter" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> <property name="beans"> <map> <entry key="bean:name=HusbandLocal" value-ref="HusbandLocal" /> </map> </property> </bean> <!-- mbean --> <bean id="HusbandLocal" class="jmx.HusbandLocal" /> </beans>org.springframework.jmx.export.MBeanExporter 是Spring暴露管理Bean(MBean)的核心类之一。它使用一个Map类型的属性——beans记录要暴露MBean的类。将咱们刚刚写的HusbandLocal以属性注入的方式注入进去。之后写一个加载Spring文件的main实例,开启服务。
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext.xml"); // 通过死循环保证主线程一直运行 while (true) { }访问jconsole(%java_home%/bin/jconsole.exe)
我们可以点击MBean的操作,比如playDOTA(),后台就调用了该方法。在这个界面还可以看到MBean的属性值,你叫他们状态也行。
以上是本地监控MBean对象,下面看看远程监控
需要在spring配置文件添加如下:
<!-- 远程连接 RMI方式--> <!-- 地址输入 service:jmx:rmi://localhost/jndi/rmi://192.168.1.100:8080/myconnector --> <bean class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="rmiRegistry" lazy-init="false"> <property name="objectName" value="connector:name=rmi" /> <!-- 远程连接的地址 --> <property name="serviceUrl" value="service:jmx:rmi://localhost/jndi/rmi://localhost:8080/myconnector" /> </bean> <!-- 使用JNDI-RMI的方式进行远程连接通讯,并且配置占用端口号 --> <bean id="rmiRegistry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"> <property name="port" value="8080" /> </bean>刚才我们将我们的MBean注册到一个基于RMI访问方式的连接服务上(ConnectorServerFactoryBean),占用的端口是8080。这时启用jconsole 以远程方式连接,不用输入密码,如下图所示
之后和在本地操作一样,可以监控MBean的属性状态,也可以进行相应的操作。
(这里俺在这里墨迹了很久,点击连接时候总是连接不上,后来才发现,spring配置文件默认bean的default_init=true的原因)
<bean class="org.springframework.jmx.support.ConnectorServerFactoryBean" depends-on="rmiRegistry" lazy-init="false">
5. 监控Web容器
如果我们要监控一下Web服务器,比如Tomcat服务器的JVM状态怎么办?这种场景非常的常见。其实配置也很简单。我们打开{Tomcat_HOME}/bin/catalina.bat,在linux下是{Tomcat_HOME}/bin/catalina.sh文件。将原有的脚本
set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager改为
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=10090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"运行startup.bat文件,之后开启JConsole,远程登录 tomcat
之后即可查看远程Tomcat资源
还有很多疑问,待续
摘自:
文献:
Spring与JMX集成