JAVA编程实现对Tomcat上部署项目的监测和控制

其实这东西完全不用自己写的,jdk提供了对操作系统监控的工具jconsole,只要稍加改动连接一下tomcat就可以对其进行监测和控制。

 

但老板的意思是要我写一个出来,去掉繁复的功能,只留下基础的功能,这样就可以嵌入到某项目中,或者做成系统的守护进程。并且点名要求使用JMX(←关键词啊!)

所以研究了几天之后做出了现在这个东东——由spring框架实现的,JMX监测管理Tomcat上部署的项目,基于页面显示的小工具。

 

因为有spring框架的支持,就变得容易很多了。

配置4个bean就可以了

1.定义解释mbean中注解的bean

[html]

  1. <bean id=“annoJmxAttrSource”  
  2.     class=“org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource” />  


2.定义assembler bean,装配bean MetadataMBeanInfoAssembler是唯一实现

[html]
  1. <bean id=“mBeanAssembler”  
  2.     class=“org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler”>  
  3.     <!– 注入定义的annoJmxAttrSource –>  
  4.     <property name=“attrSource” ref=“annoJmxAttrSource” />  
  5. </bean>  


3. 定义JMX的页面访问方式,并设置访问端口号

[html]

  1. <bean id=“httpAdapServer” class=“com.sun.jdmk.comm.HtmlAdaptorServer”>  
  2.     <property name=“port”>  
  3.         <!– 设定访问的端口号 –>  
  4.         <value>8099</value>  
  5.     </property>  
  6. </bean>  


4.定义MBeanExporter bean, 也spring jmx最核心的类

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. <bean id=“mBeanExporter” class=“org.springframework.jmx.export.MBeanExporter”  
  2.     lazy-init=“false”>  
  3.     <!– 注入上面定义的assembler –>  
  4.     <property name=“assembler” ref=“mBeanAssembler” />  
  5.     <!– 将定义的mbean注册到mBeanExporter中 –>  
  6.     <property name=“beans”>  
  7.         <map>  
  8.             <!– 将定义的HtmlAdaptorServer的bean加入mbean map中 –>  
  9.             <entry key=“MyAgent:name=jmxAdapter,port=8099” value-ref=“htmlAdapServer” />  
  10.         </map>  
  11.     </property>  
  12. </bean>  


这样spring的步骤就配置完成了。这时候只需要简单调用一下,我写了个action,提供开启、关闭的方法,并通过struts处理操作

[java]

  1. import org.springframework.beans.factory.annotation.Autowired;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4. import com.sun.jdmk.comm.HtmlAdaptorServer;  
  5.   
  6. public class Test extends ActionSupport  
  7. {  
  8.   
  9.     @Autowired  
  10.     private HtmlAdaptorServer htmlAdapServer;  
  11.   
  12.     public String JMXstart() throws Exception   
  13.     {  
  14.         this.addActionMessage(“启动JMX监控”);  
  15.         htmlAdapServer.start();  
  16.         return SUCCESS;  
  17.     }  
  18.      
  19.     public String JMXstop() throws Exception   
  20.     {  
  21.         this.clearMessages();  
  22.         this.addActionMessage(“停止JMX监控”);  
  23.         htmlAdapServer.stop();  
  24.         return SUCCESS;  
  25.     }  
  26.   
  27.     public HtmlAdaptorServer getHtmlAdapServer()   
  28.     {  
  29.         return htmlAdapServer;  
  30.     }  
  31.   
  32.     public void setHtmlAdapServer(HtmlAdaptorServer htmlAdapServer)   
  33.     {  
  34.         this.htmlAdapServer = htmlAdapServer;  
  35.     }  
  36.       
  37. }  


struts2的配置就比较简单了

[html]
  1. <package name=“jmx” namespace=“/” extends=“struts-default”>  
  2.     <action name=“start” class=“com.wyd.action.Test”  
  3.         method=“JMXstart”>  
  4.         <result name=“success”>index.jsp</result>  
  5.     </action>  
  6.     <action name=“stop” class=“com.wyd.action.Test”  
  7.         method=“JMXstop”>  
  8.         <result name=“success”>index.jsp</result>  
  9.     </action>  
  10. </package>  


index.jsp页面就两个button和一个现实信息的struts标签

启动之后看一下效果:(因为操作界面在localhost:8099,所以我加了个跳转)

操作界面里可以看到WEBModule。因为工作空间是新换的,所以只有一个用于测试的AAA和当前的Jmx

点击进入AAA之后在最下面能看到开启和关闭进程的按钮:


点击关闭之后,在地址栏访问AAA的项目就会显示访问失败,再点击开启又可以访问到了。说明Jmx运行成功了。

 

问题:这个有一点不好是只能监测到当前tomcat里的web项目,没有部署到tomcat中的项目和java项目就不能被监测到了。需求要求的是多个jvm,什么类型都有的,比这个要苛刻些,所以这个版本被淘汰鸟。。。

 

关于脱离tomcat直接监测系统服务并进行处理的方法,正在做啊。。。

标签