优化程序之前,可用Jamon来监测你的Spring应用

/**
*作者:张荣华(ahuaxuan)
*2007-8-15
*转载请注明出处及作者
*/

前两天在看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就是用来判断哪些页面需要被监视的,如下所示:


<filter>
<filter-name>JAMonFilter</filter-name>
<filter-class>com.easywebwork.filter.EasyPageMonFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>JAMonFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Java代码

/**
* @author 张荣华(ahuaxuan)
*
* @since 2007-8-13
*/
public class PageMonFilter extends JAMonFilter{
private static final long serialVersionUID = 5746197114960908454L;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
Monitor allPages = MonitorFactory.start(new MonKeyImp("org.easywebwork.allPages",getURI(request),"ms."));
//这里就是我们要监视的所有的页面的配置
Monitor monitor = MonitorFactory.start(getURI(request));
//这里就是我们要监视的某个页面的配置
try {
filterChain.doFilter(request, response);
} finally {
monitor.stop();
allPages.stop();
}
}
protected String getURI(ServletRequest request) {
if (request instanceof HttpServletRequest) {
return ((HttpServletRequest) request).getRequestURI();
} else {
return "Not an HttpServletRequest";
}
}
private FilterConfig filterConfig = null;
}}

这个类看上去很简单,其实也挺简单的,就是得到uri,然后把它注册到MonitorFactory类中。这样只要我们去访问刚才创建的monitor目录下的jsp就可以看到性能监测页面了。

2, ,接下来我们看看在使用spring的情况下如何监测一个bean的方法调用。Spring也提供了对Jamon的支持(spring支持的东西还真多啊),也就是文章开头提出的那个拦截器,为了给我们的bean加上拦截器,我们在spring的applicationcontext配置文件中加入如下语句:

Java代码

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>userService</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>jamonInterceptor</value>
</list>
</property>
</bean>
<bean id="jamonInterceptor" class="org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor">
</bean>

上面这个是典型的spring的aop的配置,如果对spring的aop配置不了解的可以去看一下spring中文文档,当然如果不想了解的话即使直接把这段配置拷到自己的项目中也是可以直接使用的。

还有一个步骤就是在你的log4j.properties中加入这句代码:

Java代码

log4j.logger.org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor = TRACE

如果没有这一行,那么这个拦截器是不会把方法调用的信息向MonitorFactory注册的。

只需要这些步骤,userservice中的方法在调用的时候就可以被拦截,然后将其注册到MonitorFactory中去了。

所有的配置完成之后我们来看一下效果吧:
http://www.iteye.com/topics/download/b2bac96e-6c18-4340-b7e0-f84c7bb6adca从这个图上我们可以看到,所有页面被访问的次数,UserService中的getAllUsers被调用的次数,最右边的是访问时间。这只是整个图的一部分,当然这个页面中也包括每一个页面被访问的次数和第一次访问的时间等等。下载附件运行,就可以看到所有的页面了。

三,总结
根据以上的步骤,我们就可以监测我们的程序了,应用程序中哪些页面被访问的多,哪些页面被访问的少,哪些方法被访问的多,哪些方法被访问的少,以及访问高峰期集中在什么时间等等,有了这些参数,我们更可以有针对性的对应用程序进行优化了,比如说某个页面访问比较频繁,我就可以用ehcache或oscache给这个页面做一个缓存。如果某个方法的访问比较频繁那就看看这个方法能否进一步优化,是需要异步,还是需要缓存,还是需要其他等等,总之有了jamon可以给我们带来更多的便捷,既可以让我们知道我们的客户的行为,也可以让我们知道我们开发的程序的“能力”。

其实本文提供的只是对页面和方法调用的监控,但是jamon可以提供更多功能,比如说sql语句的监控等等,这就需要我们共同去发掘了。

附件中包括了一个easywebwork的例子,我把jamon导入到这个例子工程中去,大家可以直接下载运行观看效果。Easywebwork是一个旨在减少webwork2.2.x系列的xml配置文件的项目,
如果对这个主题感兴趣请到
http://www.iteye.com/topic/91614
http://www.iteye.com/topic/93814
参加讨论。

时间: 2024-11-02 03:01:32

优化程序之前,可用Jamon来监测你的Spring应用的相关文章

c++,如何优化程序才不超时?(在线等)

问题描述 c++,如何优化程序才不超时?(在线等) 题目描述 沼跃鱼通过你的帮助顺利地打开了宝箱,得到了一把"BILIBILI"电击枪.但是沼跃鱼眉头一皱,发现事情并不单纯--宝箱被拿走后房间入口的那块大石板突然变成了山岭巨人.此时沼跃鱼只好拿着刚到手的电击枪迎战了.沼跃鱼使用了"洞悉"技能看穿了山岭巨人的生命值和电击枪的伤害计算方式.电击枪有四个能量槽,每个能量槽都有n种电力输出大小,若四个能量槽分别选择a1,a2,a3,a4的电力输出大小,则总的伤害为a1+a2

IIS服务器应用程序不可用解决技巧

这个问题见了好几次,在.net下 Microsoft visual 2005->visual studio tools->visual studio 2005命令提示下输入aspnet_regiis -r,就可以只是重新注册一下而已这是因为你先装了.net而后装了iis用户的权限没加进运引起我的就是这种情况,先安装了.net环境,然后才安装 了IIS. 解决方案汇总: 第一 故障描述:服务器应用程序不可用 您试图在此 Web 服务器上访问的 Web 应用程序当前不可用.请点击 Web 浏览器中

asp.net“服务器应用程序不可用”怎么办

故障分析一:造成asp.net服务器应用程序不可用的情况一般是用户安装了Net Framework之后,然后在安装包IIS程序,这样用的asp.net尚未在IIS上面注册所以才导致找不到服务器. 解决方法: 如果是没有在IIS上面注册而出现的故障的话,那么必须重新在.net命令行上线卸载在安装,然后在aspnet_regllS/i安装,安装完成后重新下IIS,再删除"默认应用程序:这样就能将asp.net站点重新创建了.之后就不会出现服务器不可用的现象了.重新注册.net的命令[C:WINDOW

服务器应用程序不可用的多种解决方案

服务器应用程序不可用解决方案集: 问题描述: 在使用VS2003和2005的时候,按F5(启动)进行调试时,出现如下错误提示: 1 并且在刚进入VS的时候也有服务器错误提示. 辗转在网上找了许多资料,终于把问题解决了! 但是由于这些错误虽然现象一致,但原因可能不尽相同,所以我把最常用的一些处理方案罗列出来,共大家参考,希望对大家有所帮助(当然,这些问题不是孤立存在的,有些方案可能会同时使用到): 方案一: 解析aspx的工作是由进程aspnet_wp.exe完成的,如果你查看了系统日志,就会发现

编程-你好,可以帮我编个输油泵优化程序吗?谢谢!!!

问题描述 你好,可以帮我编个输油泵优化程序吗?谢谢!!! 就是告诉9种泵的参数q流量,n为单耗(9种),t为几种组合各自工作时间和一天的工作时间,s为耗电量, s=qnt: 22< t<24小时 ti为每种泵工作时间 22<ti<24 就是看哪几种组合起来s最小 给定条件是Q使各种组合满足qt>Q比如q1t1+q3t3>Q:就是把单泵,多泵求最小s.谢谢!!!

IIS服务器应用程序不可用解决技巧_win服务器

这个问题见了好几次,在.net下 Microsoft visual 2005->visual studio tools->visual studio 2005命令提示下输入aspnet_regiis -r,就可以只是重新注册一下而已这是因为你先装了.net而后装了iis用户的权限没加进运引起我的就是这种情况,先安装了.net环境,然后才安装 了IIS. 解决方案汇总: 第一 故障描述:服务器应用程序不可用 您试图在此 Web 服务器上访问的 Web 应用程序当前不可用.请点击 Web 浏览器中

服务器应用程序不可用,急啊

问题描述 我在浏览站点的时候出现下面的问题服务器应用程序不可用您试图在此Web服务器上访问的Web应用程序当前不可用.请点击Web浏览器中的"刷新"按钮重试您的请求.管理员注意事项:详述此特定请求失败原因的错误信息可在Web服务器的系统事件日志中找到.请检查此日志项以查明导致该错误发生的原因.我已经在注册表里KB886903删除了,还是不行? 解决方案 解决方案二:IIS确定没问题?解决方案三:iis没问题啊,大家帮个忙啊解决方案四:aspnet_regiis-i注册一下

郁闷,程序突然提示“服务器应用程序不可用”

问题描述 服务器应用程序不可用您试图在此Web服务器上访问的Web应用程序当前不可用.请点击Web浏览器中的"刷新"按钮重试您的请求.我正在做的一个程序突然提示这个,我在网上查阅了相关资料,但是不符合我的症状,因为我并不是所有的网站都这样,在iis中还有以前开发的其他的很多.net2.0的网站,都正常,只有现在的这个不正常了,我也没动过别的什么东西啊,郁闷,请教各位是否也遇到过这个问题呢?在vs中,选定一个页面来运行,都是可以的,但是点其他的链接页就马上提示那个问题 解决方案 解决方案

IIS 6.0提示“服务器应用程序不可用”的解决办法_win服务器

今天在公司测试服务器上放了2个测试网站,iis居然报服务器应用程序不可用,把iis重启了,应用程序池也回收了,网站文件夹权限也改了,居然还是不行,好吧,下面我们来说下怎么解决的. 出错信息: 服务器应用程序不可用 您试图在此 Web 服务器上访问的 Web 应用程序当前不可用.请点击 Web 浏览器中的"刷新"按钮重试您的请求. 管理员注意事项: 详述此特定请求失败原因的错误信息可在 Web 服务器的系统事件日志中找到.请检查此日志项以查明导致该错误发生的原因. 解决办法:需要在IIS