快速业务通道

AOP@Work: 用AspectJ进行性能监视,第2部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
有工人对象)。我定义了 voidReturnAdviceExecution() 切点 ,通过对建议执行的签名使用一个基于 if 的测试以匹配建议执行。before 和 after 建议总是返回 void,而 Glassbox Inspector around 建议不会这样做。 对于我的系统,这相当于匹配 before 和 after 建议而不是 around 建议的建 议执行。

下一步,我定义 monitorHelperExec() 以匹配监视器中 helper 方法的执行 (即所有不是 execute() 或者 doExecute() 的调用)。我定义了 monitorExecuteCalls() 为监视器中所有在 execute() 或者 doExecute() 方法 中的调用,而不是对 doExecute() 本身的调用。这些切点结合在 handlingScope() 中以定义我要处理异常的连接点。

最终的效果是,在所有 before 或者 after 建议和监视 around 建议处处理 异常以避免错误影响应用程序代码,但是又不会吞掉应用程序异常。为了处理异 常,我捕获所有由进程抛出的 Throwable,然后委派给 helper 方法以在第一次 遇到时记录它们。然后建议返回,并且不抛出异常。Glassbox Inspector 还使 用 AspectJ 的 declare soft 格式向编译器表明它在建议中处理了 checked 异 常。

总之,我可以创建一个非常有效的错误隔离层。在 Glassbox Inspector 中 增加这一功能所需要的修改开销很小,从后面的性能测量中就可以看出来。

运行时控制

构建了一个有用的监视基础架构后,现在我想在不重新启动服务器的条件下 增加对所运行的监视的运行时控制。运行时控制基础架构还让 Glassbox Inspector 的用户增加开销更大的监视器以在系统出问题时捕获更详细的数据。 可以在运行时动态地启用或者禁止整个监视,也可以通过增加一个 if 测试来检 查每一个建议的切点的简单标志,从而分别启用或者禁止个别建议。为了提供控 制的常用框架,我使用清单 11 中的表达来启用和禁止每一个方面的建议:

清单 11. 在运行时启用和禁止建议

public aspect AbstractRequestMonitor { ... protected pointcut scope() : if(true); protected pointcut monitorEnabled() : isMonitorEnabled() && scope(); protected abstract pointcut isMonitorEnabled(); public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } protected boolean enabled = true; } public aspect JdbcStatementMonitor extends AbstractResourceMonitor { ... /** Monitor performance for executing a JDBC statement. */ Object around(final Statement statement) : statementExec(statement) && monitorEnabled() { ... } ... protected pointcut isMonitorEnabled() : if(aspectOf().isEnabled ()); }

AOP@Work: 用AspectJ进行性能监视,第2部分(13)

时间:2011-09-07 IBM Ron Bodkin

很自然地,我使用 JMX 提供必要的运行时控制,如清单 12 所示:

清单 12. 启用监视器的 JMX 管理

public aspect MonitorJmxManagement { /** * Management interface for monitors allows enabling and disabling * at runtime. */ public interface RequestMonitorMBean extends ManagedBean { public boolean isEnabled(); public void setEnabled(boolean enabled); } /** * Make the {@link AbstractRequestMonitor} aspect implement * {@link RequestMonitorMBean}, so all instances can be managed */ declare parents: AbstractRequestMonitor implements MonitorMBean; public String AbstractRequestMonitor.getOperationName() { return "control=monitor,type="+getClass().getName(); } public MBeanInfoAssembler AbstractRequestMonitor.g

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号