,它表示以下内容:
目标类
要调用的方法名
由作为实参传入目标方法的参数组成的负载
接着这个对象可以被继续传递,直至传递到调用方,调用方解组调用对象并针对端点目标对象实现动态执行。
客户端截取程序将当前请求时间添加到调用上下文,而服务器端截取程序则负责添加接收请求的时间戳和发送响应的时间戳。或者,服务器可以获得客户机请求,由客户机计算出请求和来回传输的总运行时间。每种情况的计算方法为:
客户端,向上传输时间等于 ServerSideReceivedTime 减去 ClientSideRequestTime
客户端,向下传输时间等于 ClientSideReceivedTime 减去 ServerSideRespondTime
服务器端,向上传输时间等于 ServerSideReceivedTime 减去 ClientSideRequestTime
清单 7 展示了客户端截取程序的 invoke 方法:
清单 7. 客户端截取程序的 invoke 方法
/**
* The interception invocation point.
* @param invocation The encapsulated invocation.
* @return 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 {
if(invocation instanceof MethodInvocation) {
getInvocationContext().put(CLIENT_REQUEST_TIME, System.currentTimeMillis());
Object returnValue = clientInvoke((MethodInvocation)invocation);
long clientResponseTime = System.currentTimeMillis();
Map<String, Serializable> context = getInvocationContext();
long clientRequestTime = (Long)context.get(CLIENT_REQUEST_TIME);
long serverReceiveTime = (Long)context.get(SERVER_RECEIVED_TIME);
long serverResponseTime = (Long)context.get(SERVER_RESPOND_TIME);
long transportUp = serverReceiveTime-clientRequestTime;
long transportDown = serverResponseTime-clientResponseTime;
long totalElapsed = clientResponseTime-clientRequestTime;
String methodName = ((MethodInvocation)invocation).getActualMethod().getName();
String className = ((MethodInvocation)invocation).getActualMethod()
.getDeclaringClass().getSimpleName();
ITracer tracer = TracerFactory.getInstance();
tracer.trace(transportUp, "EJB Client", className, methodName,
"Transport Up", transportUp);
tracer.trace(transportDown, "EJB Client", className, methodName,
"Transport Down", transportDown);
tracer.trace(totalElapsed, "EJB Client", className, methodName,
"Total Elapsed", totalElapsed);
return returnValue;
} else {
return invocation.invokeNext();
}
}
Java运行时监控,第2部分: 编译后插装和性能监控(8)
时间:2011-02-13 IBM Nicholas Whitehead
服务器端截取程序在概念上是类似的,不同的是为了避免使例子过于复杂,它使用了本地线程来检查 reentrancy — 相同的请求处理线程在同一远程调用中不只一次调用相同的 EJB(和截取程序)。该截取程序忽略了除第一个请求之外的所有请求的跟踪和上下文处理。清单 8 展示了服务器端截取程序的 invoke 方法:
清单 8. 服务器端截取程序的 invoke 方法
/**
* The interception invocation point.
* @param invocation The encapsulated invocation.
* @retur
|