快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
13 IBM Nicholas Whitehead

被部署的还有其他几个对象。这些组件通过引用它们的 Spring bean id 来描述,这些 bean id 在清单 10 中的每一个 bean 元素中都可以看得见:

tracingInterceptor 和 tracingOptimizedInterceptor:两个 SpringTracingInterceptor 类型的截取程序。这个类包含了将收集到的数据跟踪到 APM 系统的 ITracer 调用。

DataSource:一个将 JDBC 连接汇合到名为 runtime 的样例数据库的 JDBC DataSource,该样例数据库将会被注入到 EmpDAOImpl。

EmployeeDAO:我将调用的 EmpDAOImpl 将作为例子的一部分调用。

empDao 和 empDaoOptimized:spring.xml 文件中定义的最后两个 bean 为 Spring ProxyFactoryBean。它们本质上是 EmpDAOImpl 的代理,且每一个都各自引用一个截取程序。虽然 EmpDAOImpl 可以直接访问,但是使用代理会调用截取程序并生成性能指标。清单 10 中的两个代理和截取程序说明了一些差别和配置考虑。参见 优化的截取程序 侧边栏。

Spring 容器是从 SpringRunner 类中引导出来的。它还会启动一个测试循环,针对四个目标调用 DAO.get:

EmployeeDAO Spring bean,它代表一个未用 Spring 插装的托管 DAO。

empDao Spring bean,它代表一个用 Spring 插装的托管的带有标准截取程序的 DAO。

empDaoOptimized Spring bean,它代表一个用 Spring 插装的托管的带有优化截取程序的 DAO。

一个非 Spring 管理的 EmpDAOImpl,与 Spring 管理的 bean 相对。

Spring 通过一个名为 org.aopalliance.intercept.MethodInterceptor 的接口实现这些类型的截取程序。要实现的方法只有一个:public Object invoke(MethodInvocation invocation)throws Throwable。MethodInvocation 对象提供了两个关键项:带有某种上下文(即正在被截取的方法名)的跟踪程序和 proceed 方法,该方法将调用向前引领到指定目标。

清单 11 展示了 SpringTracingInterceptor 类的 invoke 方法。在这种情况下是不需要 interceptorName 属性的,但是我还是添加了这个属性,目的是为这个例子提供辅助的上下文。对于一个多用途的截取程序实现,跟踪程序通常都会将类名添加到跟踪上下文,这样所有被截取的类中的所有方法都会被跟踪到单独的 APM 名称空间中。

清单 11. SpringTracingInterceptor 类的 invoke 方法

public Object invoke(MethodInvocation invocation) throws Throwable {   String methodName = invocation.getMethod().getName();   tracer.startThreadInfoCapture(WAIT+BLOCK);   Object returnValue = invocation.proceed();   tracer.endThreadInfoCapture("Spring", "DAO",    interceptorName, methodName);   tracer.traceIncident("Spring", "DAO", interceptorName,    methodName, "Responses Per Interval");   return returnValue; }

SpringRunner 类是这个例子的主入口点。它初始化 Spring bean 工厂,然后开始一个长的循环,从而将负载置于每一个 bean 中。清单 12 展示了该循环的代码。注意由于 daoNoInterceptor 和 daoDirect 不是通过 Spring 的截取程序插装的,所以我在 SpringRunner 循环中手动添加了插装。

清单 12. 缩略的 SpringRunner 循环

Map<Integer, ? extends DAOManaged> emps = null; DAO daoIntercepted = (DAO) bf.getBean("empDao"); DAO daoOptimizedIntercepted = (DAO) bf.getBean("empDaoOptimized"); DAO daoNoInterceptor = (DAO) bf.getBean("EmployeeDAO"); DataSource dataSource = (DataSource) bf.getBean("DataSource"); DAO daoDirect = new EmpDAO

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