JavaMelody監控spring、struts

前言html

  前面講過了Javamelody的基本配置如何使用Javamelody來監控JDBC以及SQL。java

  這裏繼續講解一下如何監控struts和spring。web

  手碼不易,轉載請註明:xingoo正則表達式

  因爲spring的理論並不紮實,監控spring又是依靠sring的面向切面AOP技術來作的,所以在配置的時候雖然參照官方文檔,可是仍然沒法得到監控數據。這裏先說一下簡單的struts的監控。spring

  Struts監控

  Struts的監控相對來講要簡單多了,只要按照下面的步驟,確定是沒有問題的。apache

  第一步,導入必要的jar包,須要的jar包前面已經提到過了。編程

  一個是javamelody.jar,另外一個是jrobin-x.jar

json

  第二步,須要在web.xml中添加監控對應的過濾器app

 1 <filter>
 2   <filter-name>monitoring</filter-name>
 3   <filter-class>net.bull.javamelody.MonitoringFilter</filter-class>
 4  
 5   <init-param>
 6    <param-name>log</param-name>
 7    <param-value>true</param-value>
 8   </init-param>
 9  </filter>
10  <filter-mapping>
11   <filter-name>monitoring</filter-name>
12   <url-pattern>/*</url-pattern>
13  </filter-mapping>
14 
15 <listener>
16   <listener-class> net.bull.javamelody.SessionListener</listener-class>
17  </listener>

  固然不要忘記struts本身的過濾器框架

 1 <filter>
 2    <filter-name>struts</filter-name>
 3    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
 4  
 5    <init-param>
 6     <param-name>struts.action.extension</param-name>
 7     <param-value>action</param-value>
 8    </init-param>
 9    </filter>
10   <filter-mapping>
11    <filter-name>struts</filter-name>
12    <url-pattern>/*</url-pattern>
13   </filter-mapping>

  第三步,在struts.xml中添加默認的package,這個package提供了默認的攔截器

 1 <package name= "default" extends ="struts-default,json-default" >
 2   <!-- 向Struts2框架中註冊攔截器或者攔截器棧,通常多用於自定義攔截器或攔截器棧的註冊 -->
 3   <interceptors>
 4    <interceptor name ="monitoring" class ="net.bull.javamelody.StrutsInterceptor" />
 5    <interceptor-stack name ="myStack" >
 6     <interceptor-ref name ="monitoring" />
 7     <interceptor-ref name ="defaultStack" />
 8    </interceptor-stack>
 9   </interceptors>
10   <!--設置整個包範圍內全部Action所要應用的默認攔截器信息 -->
11   <default-interceptor-ref name ="myStack" />
12     </package>

  其餘的package好比sttuts的包,都要繼承這個default的包。

 1 <package name="test" extends="default">
 2         <action name="login" class="com.test.LoginAction">
 3             <result name="error">/error.jsp</result>
 4             <result name="success">/success.jsp</result>
 5         </action>
 6 
 7         <action name="search" class="com.test.SearchAction">
 8             <result name="error">/error.jsp</result>
 9             <result name="success">/searchSuccess.jsp</result>
10         </action>
11        
12         <action name="hibernatetest" class="com.test.TestHibernate">
13             <result name="error">/error.jsp</result>
14             <result name="success">/hibernateSuccess.jsp</result>
15         </action>
16 
17     </package>

  上面三步,就算是配置完了。

  若是不觸發監控事件,好比點擊某些東西進行響應跳轉,使用struts,那麼是監控不到數據的。雖然有顯示對應的圖片,可是圖片上的數據都是0,Nan或者下方的表爲空,這些都是沒有觸發監聽事件的緣由。

 

  Spring監控

 

  JavaMelody針對於spring的監控是到方法級別的,咱們能夠監控到某個類的某個方法,所以須要使用到AOP裏面的pointcut進行監聽。

  下面看一下主要的監聽配置:

  第一步,依然是導入必備的jar包,上面說的兩個,再也不重複了。

 

  第二步,加載monitoring-spring.xml以及咱們本身的applicationContext.xml配置文件。

  若是想要在加載web.xml的時候讀取spring的配置文件,須要實現一個監聽器

1 <listener>
2         <listener-class>
3  org.springframework.web.context.ContextLoaderListener 4         </listener-class>
5     </listener>

  而後在web.xml中,添加spring文件路徑。經過這隻上下文參數來設置

1 <context-param>
2   <param-name> contextConfigLocation</param-name>
3              <param-value>
4  classpath:net/bull/javamelody/monitoring-spring.xml 5  /WEB-INF/classes/bean.xml 6              </param-value>
7  </context-param>

  上面第一行,定義了監控應用的spring配置文件,下面是咱們本身的spring的配置文件。

  第三步,經過正則表達式,定位方法

1 <bean id="facadeMonitoringAdvisor" class="net.bull.javamelody.MonitoringSpringAdvisor">
2   <property name="pointcut">
3    <bean class="org.springframework.aop.support.JdkRegexpMethodPointcut">
4     <property name="pattern" value="com.test.*.*" />
5    </bean>
6   </property>
7  </bean>

  這裏面主要是使用了JdkRegexpMethodPointcut,也就是正則表達式定位業務方法。下面的參數多是pattern或者patterns,參數

    com.test.*.* 意思是對應com.test包下的全部類的全部方法

    com.test.*.doGet 意思是對應com.test包下全部類的叫doGet的方法

    .*Test.* 意思是全部以Test結尾的類的全部方法

  具體的配置詳情,還須要去學習一下AOP中關於切入點pointcut的使用。若是不會的話,多看一下相關的知識吧。

  而後就是針對想要監控的bean,添加這個攔截器:

 1 <bean id="ProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
 2   <property name="target">
 3    <ref bean="Computer" />
 4   </property>
 5   <property name="interceptorNames">
 6    <list>
 7     <value>facadeMonitoringAdvisor</value>
 8    </list>
 9   </property>
10  </bean>

  這樣在使用ProxyFactoryBean的時候,就會自動調用攔截器interceptorNames,定位到facadeMonitoringAdvisor中的方法,並在方法先後出發net.bull.javamelody.MonitoringSpringAdvisor,進行信息的監控。

 

  相應切面的編程代碼這裏也直接附上,有興趣的能夠運行試驗下,主要是理解這個思想,就能夠監控本身感興趣的業務了。

 1 people.java  2 public class People{  3     // 講話
 4      public void speak() {  5          System.out.println("Hello,我是People!");  6  }  7      // 跑步
 8      public void Running() {  9          System.out.println("我在跑……跑…………逃……"); 10  } 11      // 戀愛
12      public void Loving() { 13         System.out.println("我在和MM戀愛……別來打攪我!"); 14  } 15     // 死亡
16      public void died() { 17          System.out.println("完了,我死了"); 18  } 19  } 20 
21 advice類 22 public class LogerPeople implements MethodBeforeAdvice { 23  
24  public void before(Method method, Object[] args, Object target) 25    throws Throwable { 26   System.out.println(target.getClass().getSimpleName() + "正在" +
27  method.getName()+ "!"); 28   System.out.println("before!________________"); 29  
30  } 31 } 32 
33 TestMain 34 public class TestMain { 35    
36     public static void main(String[] args) { 37         ApplicationContext ac = new ClassPathXmlApplicationContext( 38                 "bean1.xml"); 39  
40         //經過ProxyFactoryBean獲取IComputer接口實現類的實例
41         People c = (People) ac.getBean("ProxyFactoryBean"); 42  c.speak(); 43  c.Running(); 44  c.Loving(); 45  c.died(); 46  } 47 } 48 
49 
50 spring配置文件 51 <bean id="Computer" class="com.test.People"></bean>
52  <bean id="LogerComputer" class="com.test.LogerPeople" />
53 
54  <bean id="ProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
55   <property name="target">
56    <ref bean="Computer" />
57   </property>
58   <property name="interceptorNames">
59    <list>
60     <value>DefaultAdvisor</value>
61    </list>
62   </property>
63  </bean>
64 
65  <bean id="DefaultAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
66   <property name="pointcut" ref="JdkRegexpPointcut" />
67   <property name="advice" ref="LogerComputer" />
68  </bean>
69  <bean id="JdkRegexpPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
70   <property name="patterns">
71    <list>
72     <value>.*spea.*</value>
73     <value>.*ing</value>
74     <value>.*di.*</value>
75    </list>
76   </property>
77   <property name="excludedPattern" value=".*Run.*" />
78  </bean>
View Code

  

  我搗鼓了一天半的時間,一直都監控不到數據,就是由於雖然配置了默認的攔截器,可是一直都沒有對攔截器進行觸發響應。所以一直都沒有調用到這個監控類,也就固然沒有監控信息出現了。

  總結起來,仍是由於沒有理解spring AOP的原理,之後會補上spring的相關學習。

相關文章
相關標籤/搜索