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,如下
我们可以点击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资源
还有很多疑问,待续
摘自:
分布式应用学习笔记08JMX规范与常用的监控场景
文献: