// ###########start of class
package rbase.core.spring.profile;
import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 性能测试,测试一个方法开始到结束所需的时间<br>
* log4j.properties 配置 <code>
* log4j.logger.rbase.core.spring.profile.UseTimeProfilerIntercepter=debug,file
*
* ### direct messages to file log ###
* log4j.appender.file=org.apache.log4j.FileAppender
* log4j.appender.file.File=profile.log
* log4j.appender.file.layout=org.apache.log4j.PatternLayout
* log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %m%n
* </code>
*
* @author ronald
* ronaldchan2005(at)gmail.com
*/
public class UseTimeProfilerIntercepter implements MethodInterceptor {
private List<String> patterns;
private static final Log log = LogFactory
.getLog(UseTimeProfilerIntercepter.class);
public Object invoke(MethodInvocation inv) throws Throwable {
String methodName = inv.getMethod().getName();
/**
* 如果不匹配方法名字则直接调用并返回
*/
if (patterns == null || !isMatch(methodName)) {
return inv.proceed();
}
String className = null;
long startTime = 0L;
Object obj = null;
if (log.isTraceEnabled()) {
className = inv.getThis().getClass().getSimpleName();
Date now = new Date();
startTime = now.getTime();
Object[] os = inv.getArguments();
log.trace(MessageFormat.format(
"[{2}] start, [{0}] mothod [{1}].args is [{3}]", className,
methodName, now, toString(os)));
}
obj = inv.proceed();
if (log.isTraceEnabled()) {
Date now = new Date();
long endTime = now.getTime();
long useTime = endTime - startTime;
log.trace(MessageFormat.format(
"[{2}] end, [{0}] mothod [{1}] use [{3}]", className,
methodName, now, useTime));
}
return obj;
}
public void setPatterns(List<String> patterns) {
this.patterns = patterns;
}
private boolean isMatch(String methodName) {
for (String s : patterns) {
if (Pattern.matches(s, methodName)) {
return true;
}
}
return false;
}
private String toString(Object[] os) {
if (os == null || os.length == 0) {
return null;
}
StringBuilder sb = new StringBuilder();
for (Object o : os) {
sb.append(MessageFormat.format("{0}={1},", o.getClass()
.getSimpleName(), o.toString()));
}
return sb.toString();
}
}
// ################# end of class
使用,
1,先要配置log4j.properties,添加以下内容
说明:profile.log可以改为绝对路径.(如:c:/profile.log).这样,输出的语句将记录在c:/profile.log文件中
############# start #############
log4j.logger.rbase.core.spring.profile.UseTimeProfilerIntercepter=debug,file
### direct messages to file log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=profile.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %m%n
############# end #############
2,在applicationContext.xml中添加一个bean,如下
<!-- 定义一个拦截器(可以定义多个) -->
<bean id="profile-intercepter"
class="rbase.core.spring.profile.UseTimeProfilerIntercepter">
<property name="patterns">
<list>
<!-- 要进行测试的方法名的正则表达式 -->
<value>.*create.*</value>
<value>.*list.*</value>
</list>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator-->
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 指定对满足哪些bean name的bean自动生成业务代理 -->
<property name="beanNames">
<!-- 下面是所有需要自动创建事务代理的bean,如下为要UserManagerImpl进行性能测试-->
<list>
<value>UesrManagerImpl</value>
</list>
<!-- 此处可增加其他需要自动创建事务代理的bean-->
</property>
<!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
<property name="interceptorNames">
<list>
<value>profile-intercepter</value>
<!-- 此处可增加其他新的Interceptor -->
</list>
</property>
</bean>
说明:以上的例子是要对UserManagerImpl的方法名中包含create,list字符的方法进行性能测试.
测试的结果将会放在profile.log中.
这是一个简单的性能测试方法,这样不用改变任何的业务方法就能进行测试,当不需测试的时候,只要在applicationContext.xml中删除刚
添加的内容就能不对该方法进行性能测试.希望这对大家找到性能瓶颈有帮助.
package rbase.core.spring.profile;
import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 性能测试,测试一个方法开始到结束所需的时间<br>
* log4j.properties 配置 <code>
* log4j.logger.rbase.core.spring.profile.UseTimeProfilerIntercepter=debug,file
*
* ### direct messages to file log ###
* log4j.appender.file=org.apache.log4j.FileAppender
* log4j.appender.file.File=profile.log
* log4j.appender.file.layout=org.apache.log4j.PatternLayout
* log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %m%n
* </code>
*
* @author ronald
* ronaldchan2005(at)gmail.com
*/
public class UseTimeProfilerIntercepter implements MethodInterceptor {
private List<String> patterns;
private static final Log log = LogFactory
.getLog(UseTimeProfilerIntercepter.class);
public Object invoke(MethodInvocation inv) throws Throwable {
String methodName = inv.getMethod().getName();
/**
* 如果不匹配方法名字则直接调用并返回
*/
if (patterns == null || !isMatch(methodName)) {
return inv.proceed();
}
String className = null;
long startTime = 0L;
Object obj = null;
if (log.isTraceEnabled()) {
className = inv.getThis().getClass().getSimpleName();
Date now = new Date();
startTime = now.getTime();
Object[] os = inv.getArguments();
log.trace(MessageFormat.format(
"[{2}] start, [{0}] mothod [{1}].args is [{3}]", className,
methodName, now, toString(os)));
}
obj = inv.proceed();
if (log.isTraceEnabled()) {
Date now = new Date();
long endTime = now.getTime();
long useTime = endTime - startTime;
log.trace(MessageFormat.format(
"[{2}] end, [{0}] mothod [{1}] use [{3}]", className,
methodName, now, useTime));
}
return obj;
}
public void setPatterns(List<String> patterns) {
this.patterns = patterns;
}
private boolean isMatch(String methodName) {
for (String s : patterns) {
if (Pattern.matches(s, methodName)) {
return true;
}
}
return false;
}
private String toString(Object[] os) {
if (os == null || os.length == 0) {
return null;
}
StringBuilder sb = new StringBuilder();
for (Object o : os) {
sb.append(MessageFormat.format("{0}={1},", o.getClass()
.getSimpleName(), o.toString()));
}
return sb.toString();
}
}
// ################# end of class
使用,
1,先要配置log4j.properties,添加以下内容
说明:profile.log可以改为绝对路径.(如:c:/profile.log).这样,输出的语句将记录在c:/profile.log文件中
############# start #############
log4j.logger.rbase.core.spring.profile.UseTimeProfilerIntercepter=debug,file
### direct messages to file log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=profile.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %m%n
############# end #############
2,在applicationContext.xml中添加一个bean,如下
<!-- 定义一个拦截器(可以定义多个) -->
<bean id="profile-intercepter"
class="rbase.core.spring.profile.UseTimeProfilerIntercepter">
<property name="patterns">
<list>
<!-- 要进行测试的方法名的正则表达式 -->
<value>.*create.*</value>
<value>.*list.*</value>
</list>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator-->
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 指定对满足哪些bean name的bean自动生成业务代理 -->
<property name="beanNames">
<!-- 下面是所有需要自动创建事务代理的bean,如下为要UserManagerImpl进行性能测试-->
<list>
<value>UesrManagerImpl</value>
</list>
<!-- 此处可增加其他需要自动创建事务代理的bean-->
</property>
<!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
<property name="interceptorNames">
<list>
<value>profile-intercepter</value>
<!-- 此处可增加其他新的Interceptor -->
</list>
</property>
</bean>
说明:以上的例子是要对UserManagerImpl的方法名中包含create,list字符的方法进行性能测试.
测试的结果将会放在profile.log中.
这是一个简单的性能测试方法,这样不用改变任何的业务方法就能进行测试,当不需测试的时候,只要在applicationContext.xml中删除刚
添加的内容就能不对该方法进行性能测试.希望这对大家找到性能瓶颈有帮助.