지금 뭐 하나 만들고 있습니다. 좀 걸출한 녀석이 나왔으면 하는 바램입니다.
그 중 HttpServlet 인터셉터 골격 코드입니다.
Bytecode를 load time(runtime)에 조작하여 클래스 로더에 올라와 있는 동안 HttpServlet을 hooking하여 각 요청에 대한 처리시간 및 동시 사용자수, cpu사용률 등을 구합니다.
Source Code
@Aspect
public class HttpServletInterceptor implements Interceptor {
Logger log = LogManager.getLogger(HttpServletInterceptor.class);
private HttpServletRequest request;
private HttpServletResponse response;
public String getName() {
return "HttpServlet Monitor Interceptor";
}
/**
* The interception point.
* @param inv The method invocation.
* @return The return of the invoked method.
* @throws Throwable
*/
@Override
public Object invoke(Invocation inv) throws Throwable {
MethodInvocation mi = (MethodInvocation) inv;
Object [] args = mi.getArguments();
for( Object obj : args) {
if( obj instanceof HttpServletRequest) {
request = (HttpServletRequest) obj;
// do something here
} else if( obj instanceof HttpServletResponse) {
response = (HttpServletResponse) obj;
// do something here
}
}
Method method = mi.getMethod();
long start = 0L;
// if you want use class or method level
String className = method.getDeclaringClass().getName();
String methodName = method.getName();
try {
start = System.currentTimeMillis();
return inv.invokeNext();
} finally {
log.info(request.getRequestURL() + " elapsed time : " + (System.currentTimeMillis() - start)/1000.0 + "s");
}
}
}
Configuration File
<?xml version="1.0" encoding="UTF-8"?><aop xmlns="urn:jboss:aop-beans:1.0"> <interceptor class="org.jboss.apm.aop.HttpServletInterceptor" scope="PER_VM"/> <bind pointcut="execution(public * com.yourcompany.biz.*->*(..))"> <interceptor-ref name="org.jboss.apm.aop.HttpServletInterceptor"/> </bind> </aop>
http://www.javapattern.info/trackback/307





