mirror of
https://gitee.com/huoyo/ko-time.git
synced 2025-12-06 16:58:26 +08:00
66 lines
2.7 KiB
Java
66 lines
2.7 KiB
Java
package cn.langpy.kotime.handler;
|
|
|
|
import cn.langpy.kotime.model.ExceptionNode;
|
|
import cn.langpy.kotime.service.GraphService;
|
|
import cn.langpy.kotime.model.MethodNode;
|
|
import cn.langpy.kotime.service.InvokeService;
|
|
import cn.langpy.kotime.service.InvokedHandler;
|
|
import cn.langpy.kotime.util.Context;
|
|
import cn.langpy.kotime.util.MethodStack;
|
|
import org.aopalliance.intercept.MethodInterceptor;
|
|
import org.aopalliance.intercept.MethodInvocation;
|
|
|
|
import java.lang.reflect.Parameter;
|
|
import java.util.concurrent.ThreadPoolExecutor;
|
|
|
|
/**
|
|
* zhangchang
|
|
*/
|
|
public class RunTimeHandler implements MethodInterceptor {
|
|
|
|
@Override
|
|
public Object invoke(MethodInvocation invocation) throws Throwable {
|
|
boolean kotimeEnable = Context.getConfig().getEnable();
|
|
if (!kotimeEnable) {
|
|
return invocation.proceed();
|
|
}
|
|
boolean exceptionEnable = Context.getConfig().getExceptionEnable();
|
|
Parameter[] parameters = invocation.getMethod().getParameters();
|
|
ThreadPoolExecutor pool = Context.getThreadPoolExecutor();
|
|
long begin = System.nanoTime();
|
|
Object obj = null;
|
|
MethodNode parent = InvokeService.getParentMethodNode();
|
|
MethodStack.record(invocation);
|
|
if (exceptionEnable) {
|
|
try {
|
|
obj = invocation.proceed();
|
|
} catch (Exception e) {
|
|
ExceptionNode exception = new ExceptionNode();
|
|
exception.setName(e.getClass().getSimpleName());
|
|
exception.setClassName(e.getClass().getName());
|
|
exception.setMessage(e.getMessage());
|
|
exception.setValue(e.getStackTrace()[0].getLineNumber());
|
|
exception.setId(exception.getClassName() + exception.getName() + exception.getMessage());
|
|
MethodNode current = InvokeService.getCurrentMethodNode(invocation, 0.0);
|
|
if (current.getClassName().equals(e.getStackTrace()[0].getClassName())) {
|
|
for (InvokedHandler invokedHandler : Context.getInvokedHandlers()) {
|
|
pool.execute(()->invokedHandler.onInvoked(current,parent,parameters, invocation.getArguments()));
|
|
}
|
|
}
|
|
MethodStack.clear();
|
|
throw e;
|
|
}
|
|
} else {
|
|
obj = invocation.proceed();
|
|
}
|
|
long end = System.nanoTime();
|
|
MethodNode current = InvokeService.getCurrentMethodNode(invocation, ((end - begin) / 1000000.0));
|
|
|
|
for (InvokedHandler invokedHandler : Context.getInvokedHandlers()) {
|
|
pool.execute(()->invokedHandler.onInvoked(current,parent,parameters, invocation.getArguments()));
|
|
}
|
|
MethodStack.clear();
|
|
return obj;
|
|
}
|
|
}
|