AOP@Work: 用AspectJ进行性能监视,第1部分 - 编程入门网
return result;
}
/** template method: proceed with original request */
public abstract Object doExecute();
/** template method: determines appropriate performance
* statistics for this request
*/
protected abstract PerfStats lookupStats();
/** returns performance statistics for this method */
public PerfStats getStats() {
if (stats == null) {
stats = lookupStats(); // get from cache if available
}
return stats;
}
public RequestContext getParent() {
return parent;
}
public void setParent(RequestContext parent) {
this.parent = parent;
}
}
}
AOP@Work: 用AspectJ进行性能监视,第1部分(8)时间:2011-09-07 IBM Ron Bodkin不出所料,对于如何存储共享的性能统计值和基方面的每请求状态,有许多 选 择。例如,我可以用带有更底层机制的单体(例如 ThreadLocal)持有一堆统计 值和上下文。但是,我选用了工人对象(Worker Object)模式(请参阅 参考资 料),因为它支持更加模块化、更简洁的表达。虽然这会带来一些额外的开销, 但是分配单一对象并执行建议所需要的额外时间,比起为 Web 和数据库请求提 供 服务来说,通常是微不足道的。换句话说,我可以在不增加开销的情况下,在监 视代码中做一些处理工作,因为它运行的频繁相对很低,而且比起在通过网络发 送信息和等候磁盘 I/O 上花费的时间来说,通常就微不足道了。对于 profiler 来说,这可能是个糟糕的设计,因为在 profiler 中可能想要跟踪每个请求中的 许多操作(和方法)的数据。但是,我是在做请求的统计汇总,所以这个选择是 合理的。 在上面的基方面中,我把当前被监视请求的中间状态保存在匿名内部类中。 这 个工人对象用来包装被监视请求的执行。工人对象 RequestContext 是在基类中 定义的,提供的 final execute 方法定义了对请求进行监视的流程。execute 方 法委托抽象的模板方法 doExecute() 负责继续处理原始的连接点。在 doExecute() 方法中也适合在根据上下文信息(例如正在连接的数据源)继续处 理被监视的连接点之前设置统计值,并在连接点返回之后关联返回的值(例如数 据库连接)。 每个监视方面还负责提供抽象方法 lookupStats() 的实现,用来确定为指定 请求更新哪个统计对象。lookupStats() 需要根据被监视的连接点访问信息。一 般来说,捕捉的上下文对于每个监视方面都应当各不相同。例如,在 HttpServletMonitor 中,需要的上下文就是目前执行操作对象的类。对于 JDBC 连接,需要的上下文就是得到的数据源。因为要求根据上下文而不同,所以设置 工人对象的建议最好是包含在每个子方面中,而不是在抽象的基方面中。这种安 排更清楚,它支持类型检测,而且也比在基类中编写一个建议,再把 JoinPoint 传递给所有孩子执行得更好。
AOP@Work: 用AspectJ进行性能监视,第1部分(9)时间:2011-09-07 IBM Ron Bodkinservlet 请求跟踪 AbstractRequestMonitor 确实包含一个具体的 after 建议,负责跟踪请求 上 下文的双亲上下文。这就让我可以把嵌套 |
||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |