前言
前面講過了Javamelody的基本配置,如何使用Javamelody來監控JDBC以及SQL。
這裡繼續講解一下如何監控struts和spring。
手碼不易,轉載請注明:xingoo
由于spring的理論并不紮實,監控spring又是依靠sring的面向切面AOP技術來做的,是以在配置的時候雖然參照官方文檔,但是仍然無法獲得監控資料。這裡先說一下簡單的struts的監控。
Struts監控
Struts的監控相對來說要簡單多了,隻要按照下面的步驟,肯定是沒有問題的。
第一步,導入必要的jar包,需要的jar包前面已經提到過了。
一個是javamelody.jar,另一個是jrobin-x.jar
第二步,需要在web.xml中添加監控對應的過濾器
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的相關學習。
作者:xingoo
出處:http://www.cnblogs.com/xing901022
本文版權歸作者和部落格園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接!