快速业务通道

Java运行时监控,第2部分: 编译后插装和性能监控 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
n The return value of the invocation. * @throws Throwable * @see org.jboss.aop.advice.Interceptor#invoke(org.jboss.aop.joinpoint.Invocation) */ public Object invoke(Invocation invocation) throws Throwable {   Boolean reentrant = reentrancy.get();   if((reentrant==null || reentrant==false)    && invocation instanceof MethodInvocation) {    try {      long currentTime = System.currentTimeMillis();      MethodInvocation mi = (MethodInvocation)invocation;      reentrancy.set(true);      Map<String, Serializable> context = getInvocationContext(mi);      context.put(SERVER_RECEIVED_TIME, currentTime);      Object returnValue = serverInvoke((MethodInvocation)mi);      context.put(SERVER_RESPOND_TIME, System.currentTimeMillis());      return addContextReturnValue(returnValue);    } finally {      reentrancy.set(false);    }   } else {    return invocation.invokeNext();   } }

JBoss 通过面向方面的编程(aspect-oriented programming,AOP)(参见 参考资料)技术来应用截取程序,该技术读取名为 ejb3-interceptors-aop.xml 的指令文件并根据其中定义的指令应用截取程序。JBoss 使用这种 AOP 技术在运行时将 Java EE 核心规则应用于 EJB 3 类。因此,除了性能监控截取程序之外,该文件还包含了关于事务管理、安全性和持久性这样的指令。客户端指令则相当简单明了。它们被简单地定义为包含一系列截取程序类名的 stack name XML 元素。每一个在此定义的类名同时都有资格作为 PER_VM 或 PER_INSTANCE 截取程序,这表明每一个 EJB 实例都应该共享一个截取程序实例或者具有各自的非共享实例。针对性能监控截取程序的目标,则应该确定此项配置,无论截取程序代码是否是线程安全的。如果截取程序代码能够安全地并行处理多个线程,那么使用 PER_VM 策略更有效,而对于线程安全但是效率较低的策略,则可以使用 PER_INSTANCE。

服务器端的截取程序的配置要相对复杂一些。截取程序要依照一组语法模式和用 XML 定义的过滤器来应用。如果所关注的特定的 EJB 方法与定义的模式相符的话,那么为该模式定义的截取程序就会被应用。服务器端截取程序能够通过进一步细化定义来将部署的 EJB 的特定子集定为目标。对于客户端截取程序,您可以通过创建一个新的特定于目标 bean 的 stack name 来实现自定义栈。而在服务器端,自定义栈可以在一个新的 domain 中进行定义。个别 EJB 的关联客户机 stack name 和服务器栈 domain 可以在 EJB 的注释中指定。或者,如果您不能或是不想修改源代码的话,这些信息可以在 EJB 的部署描述符中指定或者跳过。清单 9 展示了一个删减的用于此例的 ejb3-interceptors-aop.xml 文件:

清单 9. 经过删减的 EJB 3 AOP 配置

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE aop PUBLIC   "-//JBoss//DTD JBOSS AOP 1.0//EN"   "http://labs.jboss.com/portal/jbossaop/dtd/jboss-aop_1_0.dtd"> <aop>   .   .   <interceptor    class="org.runtimemonitoring.ejb.interceptors.ClientContextualInterceptor"    scope="PER_VM"/>   .   .   <stack name="StatelessSessionClientInterceptors">    <interceptor-ref      name="org.runtimemonitoring.ejb.interceptors.ClientContextualInterceptor"/>    .    .   &

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号