我:你看那本《三杯茶》了没有?
老婆:看了。
我:怎么样?
老婆:挺好的,讲人性的。
我:啊,你看懂了,我看了一点咋没看懂。
老婆:那当然了,你没有人性么。
Sunday, October 4, 2009
Saturday, September 12, 2009
搭建公司Hudson持续集成环境
一直说在公司搭建持续集成环境,前前后后拖 了有快一年了,总算是在昨天下午快下班前初步搭建出来了。说来也是偶然,本来是到下午快下班的时候感觉精神不太好,就随便找了点资料,没想到Hudson 这么容易用,三下五除二竟然就搭建起来了。昨天下班的时候已经可以初步运行自动测试脚本了。今天来又把Hudson的Slave支持给看了一下,真是感觉 越看越强大,很容易就可以搭建一个分布式的持续集成环境。下一步就是把我们目前我们在做的项目怎么一个一个加入到持续集成环境里,这样Dev就可以很方便 的测试每天的修改的代码了。但是到这里,说句心里话,还是有点担心,担心的不是Hudson能不能瞒住我们现在的需要,而是如果我把这个东西推广出去后, 按照现在Boss们这么激进的想法和做法,肯定会一窝风的推荐大家都去用,就像当初的Selenium一样,这样就有可能会每个组会有一套自己的东西按照 自己的想法去做,从而导致东西越用越复杂,越用越乱,就像我们的GUI一样,这样到最后很有可能出现意想不到的后果,真是难呀。
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 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
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里以备以后使用。
Subscribe to:
Posts (Atom)