Sunday, August 16, 2009

perf4j vs. simon

1. perf4j的资料和例子要比simon详细一些。
2. perf4j和spring的集成要比simon好一些,simon现在还不能实现代理有参数构造函数的bean,此时simon会出现(Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given)异常(http://netfork.javaeye.com/blog/286215)。因此目前要想使用必须要么使用JDK自带的自动代 理,要么必须提供默认构造函数,要么修改spring的类。
3. perf4j和simon都提供了Annotation注解支持,但都依赖spring aop的实现,就是会有#2中的问题。
4. perf4j目前支持将日志信息写入日志文件,然后用命令行来查看结果。但是simon目前没有提供默认实现。但是可以通过callback来自己实现。
5. perf4j支持设置统计结果的显示步长,simon不能设置,但是simon提供了clear方法,可以清空当前内存中的统计信息重新开始统计,这一点perf4j默认实现不了,必须自己编程实现。
6. 目前项目中使用的是让perf4j来解析整个日志文件类来产生最后的结果,这样如果日志文件太大,统计分析会比较慢。

Spring AOP - Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

今天在集成perf4j和javasimon到代码里的时候发现一些问题,就是本来在自己的测试代码里运行好好的东西,在放到项目代码里的时候总是报以下错误:
...
Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
...
比 较了代码半天发现在自己的测试代码里没有用到有构造参数的spring bean,而在项目代码中很多的类都是通过有参数构造函数来创建的。而spring在借助cglib创建目标对象子类时,并没有对有参数构造函数做处理, 而是使用的默认我参数构造函数,这就导致了以上异常的出现。这里有一个很详细的文章对这个问题做了描 述,http://netfork.javaeye.com/blog/286215

Friday, August 7, 2009

Struts2中Action的@BeforeResult方法被执行两次问题


这个问题通常会在两种情况下发生
第一种是在标注了@BeforeResult的方法中有异常发生,这个时候struts2会调用这个方法多次,这个问题同事有很多人碰到过,解决办法是在标注了@BeforeResult的方法中捕获所有异常,然后添加到ActionError中。
第二种是出现的情况是在两个有继承关系的Action中都标注有@BeforeResult方法,这个时候struts就好调用子类中的
标注有@BeforeResult的方法两次,这个问题可以从xwork的源代码com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor中发现问题所在。
public void beforeResult(ActionInvocation invocation, String resultCode) {
Object action = invocation.getAction();
List methods = AnnotationUtils.findAnnotatedMethods(action.getClass(), BeforeResult.class);

if (methods != null && methods.size() > 0) {
Collections.sort(methods, new Comparator() {
public int compare(Method method1, Method method2) {
return method2.getAnnotation(BeforeResult.class).priority()
- method1.getAnnotation(BeforeResult.class).priority();
}
});
for (Method m : methods) {
try {
m.invoke(action, (Object[]) null);
} catch (Exception e) {
throw new XWorkException(e);
}
}
}
}

实现中首先是找到所有的标注有@BeforeResult的方法,然后在子类的实现上依次调用找到的方法,所以就出现了调用两次的问题。解决办法比较简单就是避免这种结构出现在自己的类中,或者自己写一些代码检查是不是已经执行过@BeforeResult中的方法。

Monday, July 27, 2009

perf4j中使用Piped I/O Stream

这几天是在作JMX和 一些关于Performance的调研,由于JMX三年前在Perf中用过,所以这次重点不是JMX,二是怎样用JMX来管理,监控WEBGUI,另外就 是怎么把一些和Performace相关的接口暴露成JMX。今天做了一些perf4j,一个开源的performce工具的调研,其中碰到一个问题,还是给我自己上了一课。那就是在perf4j里有一个接口使用PrintStream作参数,然后perf4j把解析后的日志信息输出到 PrintStream,但是我有一个需求就是想要返回格式化后的日志内容,今天花了很多时间在找已有的JavaAPI和第三方的API,另外就是使用 PipedInoutStream和PipedOutputStream,最后还是没有找到太好的方案,这时突然想到,为什么我不自己写个类实现 OutputStream,内部用StringBuffer来缓存格式化后的日志内容呢,相到这,我就迅速的写了一个非常简单的类很轻松的实现了原本自己 的需求,代码如下:
http://code.google.com/p/garbagecan/source/browse/trunk/java/perf4jstudy/src/main/java/com/googlecode/garbagecan/perf4jstudy/LogParserUtil.java
另外在做这些调研的时候还试着使用了一下PipedInputStream和PipedOutputStream两个流
http://code.google.com/p/garbagecan/source/browse/trunk/java/perf4jstudy/src/main/java/com/googlecode/garbagecan/perf4jstudy/PipedIO.java

Monday, June 15, 2009

难用的ICM Performance JMX

今 天在公司有点感冒,本想下午请假回家休息,结果不知不觉弄一个Performance问题弄了一个下午。本以为ICM提供的JMX会有很大帮助,最后发现 他们给API都太简单了,不方便使用和统计。没办法自己想了想好像可以在原来ICM的ServiceFactory上做一个动态代理来代理所有的 ServiceClient,从而实现对方法调用次数和用时的统计,说做就做,由于在ServiceFactory里是使用的类,而不是借口,所以排除了 直接使用JDK的动态代理实现,而只能使用cglib来实现,原来做过这方面的东西,所以简单又查看了一下cglib的文档和例子(例子少的可怜也简单的 可怜),花了两个小时很快就弄了一个出来。同时也整理了一个文档放在google docs里以备以后使用。

Saturday, May 23, 2009

Bug Fix Plan

一个月前,Yi让我做了一个Excalibur Bug Fix Plan,自我感觉做的不错,邮件内容如下:
=========================================================

Just now, Excalibur_GUI and Unit_Test_Excalibur_GUI area has total 70 p1 + p2 bugs.

Note: This 70 bugs not includes the bugs that will be fixed once sprint2 project finish - 17 bugs

Sprint2 Bug fix plan:

Week

Dev Resource

Plan Dev Fixed

Plan QA Logged

Bug Number

(approximation)

Apr. 24 - Apr. 24

-

-

-

70

Apr. 27 - Apr. 30 (4 days)

1.5

2 * 1.5 * 4 = 12

3 * 4 = 12

70

May. 4 - May. 8

3

2 * 3 * 5 = 30

15 * 5 = 75

115

May. 11 - May. 15

10.5

2 * 10.5 * 5= 105

15 * 5 = 75

85

May. 18 - May. 22

10.5

2 * 10.5 * 5= 105

10 * 5 = 50

40

May. 25 - May. 29 (4 days)

10.5

1 * 10.5 * 4 = 44

10 * 4 = 40

???

Dev Resource:

Resource

Apr. 27 - Apr. 30

May. 4 - May. 8

May. 11 - May. 15

Chunlin



100%

Gang



100%

Jiangwei

100%

100%

100%

Lin



100%

Liyuan

50%

100%

100%

Chao



100%

Fanbin



50%

Hong



100%

Peng


50%

100%

Xiaodong



100%

Yong


50%

100%

SubTotal #

1.5

3

10.5

Note: The resource does not include Wanqing.

=========================================================
今 天看了实际情况和预计的差别比较大,主要原因是Dev一直有新项目来,不能保证有足够的Resource在Bug Fix上,实际上May 11-May 15这周只有3个人在Bug Fix上,粗略估计了一下,如果最后一周大家都在Bug Fix上,应该和当初预想的差不多。目前P1+P2有120个bug,如果能在May 11 - May 15这周再加上预期的7.5的resource,就应该是120-7.5×2×5=45左右,应该算很准了。

Tuesday, March 10, 2009

收购StarUML

今天在公司讨论关于画UML的图的工具的时候,想到了StarUML,一个被很多人遗忘的软件。其实这是一个很不错,不对,是相当不错的开源的UML/MDA软件。但是令人遗憾的是这个软件自从2005年底的release之后就再也没有新消息,在官方网站的Roadmap上可以看出还是有很多的feature想做的,但是不知道现在为什么没有新的动作!与其这样,还不如那个公司站出来把它收购得了,改吧改吧直接就可以卖钱了,尤其在当前经济危机的情况下。