前言html
前面講過了Javamelody的基本配置,如何使用Javamelody來監控JDBC以及SQL。java
這裏繼續講解一下如何監控struts和spring。web
手碼不易,轉載請註明:xingoo正則表達式
因爲spring的理論並不紮實,監控spring又是依靠sring的面向切面AOP技術來作的,所以在配置的時候雖然參照官方文檔,可是仍然沒法得到監控數據。這裏先說一下簡單的struts的監控。spring
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或者下方的表爲空,這些都是沒有觸發監聽事件的緣由。
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>
我搗鼓了一天半的時間,一直都監控不到數據,就是由於雖然配置了默認的攔截器,可是一直都沒有對攔截器進行觸發響應。所以一直都沒有調用到這個監控類,也就固然沒有監控信息出現了。
總結起來,仍是由於沒有理解spring AOP的原理,之後會補上spring的相關學習。