ko-time/src/main/java/cn/langpy/kotime/handler/RunTimeHandler.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;
}
}