们应用于 EJB。清单 3 展示了样例 EJB 的 ejb-jar.xml 部署描述符:
清单 3. EJB 3 截取程序部署描述符
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0">
<interceptors>
<interceptor>
<interceptor-class>
org.runtimemonitoring.interceptors.ejb.EJBTracingInterceptor
</interceptor-class>
<around-invoke>
<method-name>trace</method-name>
</around-invoke>
</interceptor>
</interceptors>
<assembly-descriptor>
<interceptor-binding>
<ejb-name>AA4H-HibernateService</ejb-name>
<interceptor-class>
org.runtimemonitoring.interceptors.ejb.EJBTracingInterceptor
</interceptor-class>
</interceptor-binding>
</assembly-descriptor>
</ejb-jar>
正如我在前面所提到过的,插装截取程序对于基于上下文或者基于范围/阈值的跟踪是有用的。而 InvocationContext 中的 EJB 调用参数值是可用的,这加强了插装截取程序的作用。这些值可以用于跟踪范围或其他上下文的复合名称。考虑一下包含有 issueRemoteOperation(String region、Command command) 方法的 org.myco.regional.RemoteManagement 类中的 EJB 调用。EJB 接受一个命令,然后远程调用根据域识别的服务器。在这个场景中,区域服务器遍布于一个广泛的地理区域,每一个区域服务都有自己的 WAN 特性。这里呈现的模式与 第 1 部分 中的 payroll-processing 例子类似,这是因为如果没有明确命令到底被分配到哪一个区域的话,确定一个 EJB 调用的运行时间是很困难的。您可能已经预料到,从距离一个洲远的区域调用的运行时间要比从隔壁调用的运行时间要长的多。但是您是可以从 InvocationContext 参数确定区域的,因此您只需将区域代码添加到跟踪复合名称并按区域划分性能数据,如清单 4 所示:
清单 4. EJB 3 截取程序实现上下文跟踪
String[] prefix = null;
if(ctx.getTarget().getClass().getName()
.equals("org.myco.regional.RemoteManagement") &&
ctx.getMethod().getName().equals("issueRemoteOperation")) {
prefix = new String[]{"RemoteManagement",
ctx.getParameters()[0].toString(),
"issueRemoteOperation"};
}
// Now add prefix to the tracing compound name
Servlet 过滤器截取程序
Java Servlet API 提供了一个叫做过滤器(filter)的构造,它与 EJB 3 截取程序非常类似,含有无需源代码的注入和元数据可用性。清单 5 展示了一个过滤器的 doFilter 方法,带有缩略了的插装。指标的复合名由过滤器类名和请求的统一资源标识符(Uniform Resource Identifier,URI)构建:
清单 5. servlet 过滤器截取程序方法
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain filterChain) throws IOException, ServletException {
String uri = null;
try {
uri = ((HttpServletRequest)req).getRequestURI();
tracer.startThreadInfoCapture(CPU + BLOCK + WAIT);
// ===================================
|