posts - 0,  comments - 17,  trackbacks - 0
          **
          *作者:張榮華(ahuaxuan)
          *2007-8-15
          *轉(zhuǎn)載請注明出處及作者
          */

          前兩天在看Spring內(nèi)置的攔截器的時(shí)候,發(fā)現(xiàn)了一個(gè)之前沒有注意的類:org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor,好奇心促使我上網(wǎng)查了一下這個(gè)jamon。大概看了一下之后發(fā)現(xiàn)這個(gè)玩意還真挺好用的而且挺重要的,而且現(xiàn)在國內(nèi)對它的介紹也很少,所以寫了一篇文章和大家分享。

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

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

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

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

          1, 檢測自己的頁面訪問率
          首先我們需要在web.xml中添加一個(gè)filter,這個(gè)filter就是用來判斷哪些頁面需要被監(jiān)視的,如下所示:
          Java代碼 復(fù)制代碼
          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>  
          接下來我們看看這個(gè)filter的寫法:
          Java代碼 復(fù)制代碼
          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.          //這里就是我們要監(jiān)視的所有的頁面的配置   
          13.          Monitor monitor = MonitorFactory.start(getURI(request));   
          14.          //這里就是我們要監(jiān)視的某個(gè)頁面的配置   
          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. }}  

          這個(gè)類看上去很簡單,其實(shí)也挺簡單的,就是得到uri,然后把它注冊到MonitorFactory類中。這樣只要我們?nèi)ピL問剛才創(chuàng)建的monitor目錄下的jsp就可以看到性能監(jiān)測頁面了。

          2, ,接下來我們看看在使用spring的情況下如何監(jiān)測一個(gè)bean的方法調(diào)用。Spring也提供了對Jamon的支持(spring支持的東西還真多啊),也就是文章開頭提出的那個(gè)攔截器,為了給我們的bean加上攔截器,我們在spring的applicationcontext配置文件中加入如下語句:
          Java代碼 復(fù)制代碼
          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>  

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

          還有一個(gè)步驟就是在你的log4j.properties中加入這句代碼:
          Java代碼 復(fù)制代碼
          1. log4j.logger.org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor = TRACE  

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

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

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

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

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

          附件中包括了一個(gè)easywebwork的例子,我把jamon導(dǎo)入到這個(gè)例子工程中去,大家可以直接下載運(yùn)行觀看效果。Easywebwork是一個(gè)旨在減少webwork2.2.x系列的xml配置文件的項(xiàng)目,
          如果對這個(gè)主題感興趣請到
          http://www.javaeye.com/topic/91614
          http://www.javaeye.com/topic/93814
          參加討論。
          posted on 2008-03-14 14:40 xyz 閱讀(773) 評論(0)  編輯  收藏 所屬分類: 網(wǎng)絡(luò)文摘

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿

          隨筆檔案(1)

          文章分類(44)

          文章檔案(46)

          收藏夾(1)

          Adobe

          AOP

          API

          appServer

          BI

          c

          • c-free
          • codeblocks
          • codelite
          • CodeLite IDE 是一個(gè)強(qiáng)大的開源,跨平臺的 C/C++整合開發(fā)環(huán)境. 支持包括 Windows、Linux 和 Mac 系統(tǒng)下運(yùn)行
          • codelite官網(wǎng)
          • dev-c++
          • Dev-C++是一個(gè)C&C++開發(fā)工具,它是一款自由軟件,遵守GPL協(xié)議。
          • GCC
          • GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因?yàn)樗局荒芴幚?C語言。GCC 很快地?cái)U(kuò)展,變得可處理 C++。之后也變得可處理 Fortran、Pascal、Objective-C、Java, 以及 Ada 與其他語言。

          Cache

          CMS

          DB

          eclipse

          FreeMarker

          hibernate

          html5

          ibatis

          java

          jquery

          js

          json

          Linux

          Log

          mail server

          mobile

          mysql

          oauth

          openID

          other

          PHP

          portal

          report

          Scheduler

          schema

          Security

          SOA

          spring

          struts

          UI原型設(shè)計(jì)

          w3c

          Wap

          webservice

          xml

          供應(yīng)鏈管理

          博客鏈接

          好網(wǎng)站

          工作流

          開源網(wǎng)

          招聘

          插件下載

          操作系統(tǒng)

          構(gòu)建可伸縮的系統(tǒng)

          構(gòu)建工具

          測試

          • IETest
          • IE官網(wǎng)
          • OpenSTA
          • Siege
          • Siege是一個(gè)壓力測試和評測工具,設(shè)計(jì)用于WEB開發(fā)這評估應(yīng)用在壓力下的承受能力

          游戲

          源碼托管

          經(jīng)營

          資源

          金融/財(cái)務(wù)

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 洪泽县| 海口市| 柘荣县| 芜湖县| 石嘴山市| 阿拉善左旗| 会昌县| 肃北| 修武县| 泰安市| 浦东新区| 富源县| 渝北区| 邹城市| 中西区| 临安市| 湘潭市| 兴宁市| 蕲春县| 绥宁县| 遵义市| 翁源县| 四会市| 冷水江市| 福贡县| 大丰市| 沅江市| 麻城市| 鸡西市| 儋州市| 咸阳市| 博罗县| 胶南市| 沐川县| 商洛市| 松溪县| 英山县| 那曲县| 神木县| 色达县| 德保县|