He hecho esto usando Spring AOP.
En algún momento necesito información sobre cuánto tiempo lleva ejecutar algunos métodos en mi proyecto (método del controlador en el ejemplo).
En xml servlet puse
<aop:aspectj-autoproxy/>
Además, tengo que crear la clase de aspectos:
@Component
@Aspect
public class SystemArchitecture {
@Pointcut("execution(* org.mywebapp.controller..*.*(..))")
public void businessController() {
}
}
y de perfiles de aspecto:
@Component
@Aspect
public class TimeExecutionProfiler {
private static final Logger logger = LoggerFactory.getLogger(TimeExecutionProfiler.class);
@Around("org.mywebapp.util.aspects.SystemArchitecture.businessController()")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
logger.info("ServicesProfiler.profile(): Going to call the method: {}", pjp.getSignature().getName());
Object output = pjp.proceed();
logger.info("ServicesProfiler.profile(): Method execution completed.");
long elapsedTime = System.currentTimeMillis() - start;
logger.info("ServicesProfiler.profile(): Method execution time: " + elapsedTime + " milliseconds.");
return output;
}
@After("org.mywebapp.util.aspects.SystemArchitecture.businessController()")
public void profileMemory() {
logger.info("JVM memory in use = {}", (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
}
}
eso es todo. Cuando solicito una página de mi aplicación web, la información sobre el tiempo de ejecución del método y el uso de la memoria JVM se imprime en el archivo de registro de mi webapp.
La aplicación de perfiles de Spring no es realmente diferente de la creación de perfiles de cualquier otra aplicación de Java. Es posible que desee ampliar la pregunta para obtener una selección más amplia de respuestas. – skaffman