Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          前兩天在看Spring內置的攔截器的時候,發現了一個之前沒有注意的 類:org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor, 好奇心促使我上網查了一下這個jamon。大概看了一下之后發現這個玩意還真挺好用的而且挺重要的,而且現在國內對它的介紹也很少,所以寫了一篇文章和大 家分享。

          一,Jamon簡介:
          Jamon的全名是:Java Application Monitor。它是一個小巧的,免費的,高性能的,線程安全的性能監測工具。它可以用來測定系統的性能瓶頸,也可以用來監視用戶和應用程序之間的交互情 況。 Jamon主要是用來檢測jee的應用程序。它最新的版本是2.1,可以用在1.4以上的jdk上。

          二,將jamon導入到你的應用程序中去
          首先下載jamon的開發包,見我的附件,同時你也可以去Sourceforge上自己下載。Sourceforge的下載地址為 http://jamonapi.sourceforge.net。解壓之后可以得到一個jar包和一個war包。jar包是自己會用到的,而war包是 一個例子(不要小看這個例子,待會也要把它導入到項目中)。把war包之間丟到服務器上,訪問:localhost:8080/jamon就可以看到這個 例子了,這個例子是一個簡單的性能監控系統。

          接著把例子中的所有的包都導入到項目中,并把war包中的jsp和images還有css都考到項目中,比如新建一個目錄叫monitor(它和WEB-INF是同級目錄)。

          三,正確配置自己的應用
          我們在性能監測的時候最監測的就是頁面的訪問率和類中方法的訪問率。所以在這一部分主要講解一下如何監測自己的頁面和類中方法的訪問。

          1, 檢測自己的頁面訪問率
          首先我們需要在web.xml中添加一個filter,這個filter就是用來判斷哪些頁面需要被監視的,如下所示:
          Java代碼
          1. <filter>??
          2. ????????<filter-name>JAMonFilter</filter-name>??
          3. ????????<filter-class>com.easywebwork.filter.EasyPageMonFilter</filter-class>??
          4. ????</filter>??
          5. ????<filter-mapping>??
          6. ????????<filter-name>JAMonFilter</filter-name>??
          7. ????????<url-pattern>/*</url-pattern>??
          8. ????</filter-mapping>??
          接下來我們看看這個filter的寫法:
          Java代碼
          1. /**?
          2. ?*?@author?張榮華(ahuaxuan)?
          3. ?*?
          4. ?*?@since?2007-8-13?
          5. ?*/??
          6. public?class?PageMonFilter?extends?JAMonFilter{??
          7. ??
          8. ????private?static?final?long?serialVersionUID?=?5746197114960908454L;??
          9. ??
          10. ????public?void?doFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?filterChain)?throws?IOException,?ServletException?{??
          11. ?????????Monitor?allPages?=?MonitorFactory.start(new?MonKeyImp("org.easywebwork.allPages",getURI(request),"ms."));??
          12. ?????????//這里就是我們要監視的所有的頁面的配置??
          13. ?????????Monitor?monitor?=?MonitorFactory.start(getURI(request));??
          14. ?????????//這里就是我們要監視的某個頁面的配置??
          15. ?????????try?{??
          16. ??????????filterChain.doFilter(request,?response);??
          17. ?????????}?finally?{??
          18. ??????????monitor.stop();??
          19. ??????????allPages.stop();??
          20. ?????????}??
          21. ???????}??
          22. ??
          23. ???????protected?String?getURI(ServletRequest?request)?{??
          24. ?????????if?(request?instanceof?HttpServletRequest)?{??
          25. ???????????return?((HttpServletRequest)?request).getRequestURI();??
          26. ?????????}??else?{??
          27. ???????????return?"Not?an?HttpServletRequest";??
          28. ?????????}??
          29. ???????}??
          30. ??
          31. ???????private?FilterConfig?filterConfig?=?null;??
          32. ?????????
          33. }}??

          這個類看上去很簡單,其實也挺簡單的,就是得到uri,然后把它注冊到MonitorFactory類中。這樣只要我們去訪問剛才創建的monitor目錄下的jsp就可以看到性能監測頁面了。

          2, ,接下來我們看看在使用spring的情況下如何監測一個bean的方法調用。Spring也提供了對Jamon的支持(spring支持的東西還真多 啊),也就是文章開頭提出的那個攔截器,為了給我們的bean加上攔截器,我們在spring的applicationcontext配置文件中加入如下 語句:
          Java代碼
          1. <bean?class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">??
          2. ????????<property?name="beanNames">??
          3. ????????????<list>??
          4. ????????????????<value>userService</value>????????????????
          5. ????????????</list>??
          6. ????????</property>??
          7. ????????<property?name="interceptorNames">??
          8. ????????????<list>??
          9. ????????????????<value>jamonInterceptor</value>??
          10. ????????????</list>??
          11. ????????</property>??
          12. ????</bean>??
          13. ??????
          14. ????<bean?id="jamonInterceptor"?class="org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor">??
          15. </bean>??

          上面這個是典型的spring的aop的配置,如果對spring的aop配置不了解的可以去看一下spring中文文檔,當然如果不想了解的話即使直接把這段配置拷到自己的項目中也是可以直接使用的。

          還有一個步驟就是在你的log4j.properties中加入這句代碼:
          Java代碼
          1. log4j.logger.org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor?=?TRACE??

          如果沒有這一行,那么這個攔截器是不會把方法調用的信息向MonitorFactory注冊的。

          只需要這些步驟,userservice中的方法在調用的時候就可以被攔截,然后將其注冊到MonitorFactory中去了。

          所有的配置完成之后我們來看一下效果吧:
          http://www.javaeye.com/topics/download/b2bac96e-6c18-4340-b7e0-f84c7bb6adca從這個圖上我們可以看到,所有頁面被訪問的次數,UserService中的getAllUsers被調用的次數,最右邊的是訪問時間。這只是整個圖的一部分,當然這個頁面中也包括每一個頁面被訪問的次數和第一次訪問的時間等等。下載附件運行,就可以看到所有的頁面了。

          三,總結
          根據以上的步驟,我們就可以監測我們的程序了,應用程序中哪些頁面被訪問的多,哪些頁面被訪問的少,哪些方法被訪問的多,哪些方法被訪問的少,以 及訪問高峰期集中在什么時間等等,有了這些參數,我們更可以有針對性的對應用程序進行優化了,比如說某個頁面訪問比較頻繁,我就可以用ehcache或 oscache給這個頁面做一個緩存。如果某個方法的訪問比較頻繁那就看看這個方法能否進一步優化,是需要異步,還是需要緩存,還是需要其他等等,總之有 了jamon可以給我們帶來更多的便捷,既可以讓我們知道我們的客戶的行為,也可以讓我們知道我們開發的程序的“能力”。

          其實本文提供的只是對頁面和方法調用的監控,但是jamon可以提供更多功能,比如說sql語句的監控等等,這就需要我們共同去發掘了。

          附件中包括了一個easywebwork的例子,我把jamon導入到這個例子工程中去,大家可以直接下載運行觀看效果。Easywebwork是一個旨在減少webwork2.2.x系列的xml配置文件的項目,
          如果對這個主題感興趣請到
          http://www.javaeye.com/topic/91614
          http://www.javaeye.com/topic/93814
          參加討論。
          posted on 2010-09-29 10:39 禮物 閱讀(263) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。

          網站導航:
           
          主站蜘蛛池模板: 固镇县| 北流市| 晋江市| 中宁县| 洱源县| 河西区| 喀喇| 石棉县| 错那县| 崇文区| 长宁区| 津市市| 陆川县| 宜黄县| 富阳市| 凉城县| 尉犁县| 溆浦县| 阳西县| 安泽县| 璧山县| 封丘县| 南郑县| 泰顺县| 丹凤县| 盐城市| 英吉沙县| 南木林县| 阿拉善左旗| 洛浦县| 松江区| 深圳市| 富平县| 城市| 孟津县| 宜城市| 象州县| 阆中市| 名山县| 潞西市| 宾川县|