Java运行时监控,第2部分: 编译后插装和性能监控 - 编程入门网
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 配置
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |