Upload
mauricio-quezada
View
855
Download
4
Embed Size (px)
DESCRIPTION
Resumiendo unas cuantas de caracteristicas del framework de errores desarrollado bajo AspectJ
Citation preview
Monitorizando aplicacionescon AspectJ
Mauricio Quezada04/02/2011
AspectJ
• Lenguaje orientado a aspectos
• Aspecto: modulariza crosscutting concerns
• Se compila a código Java equivalente
AspectJ
• Joinpoint : “la llamada a un método”
AspectJ
• Joinpoint : “la llamada a un método”
• Pointcut : “la llamada al método foo()”
AspectJ
• Joinpoint : “la llamada a un método”
• Pointcut : “la llamada al método foo()”
• Advice : “después de llamar a foo(), imprime ‘hola’”
AspectJ
• Joinpoint : “la llamada a un método”
• Pointcut : “la llamada al método foo()”
• Advice : “después de llamar a foo(), imprime ‘hola’”
after(): call(void foo()) {System.out.println(“hola”);
}
You have to catch ‘em all
after() throwing(Throwable t):execution(* *..*(..)) {
Controller.process(t, thisJoinPoint);}
You have to catch ‘em all
after() throwing(Throwable t):execution(* *..*(..)) {
Controller.process(t, thisJoinPoint);}
thisJoinPoint / thisJoinPointStaticPart:- Información dinámica/estática del joinpoint capturado (source, método, argumentos, etc)
Problema
class A {
void foo() { throw new Error(); }
void bar() { foo(); }
static public void main() {new A().bar();
}}
• Se registra la excepción 2 veces!
• Se registra la excepción 2 veces!
• Solución: guardar la excepción recién capturada
if(isParentOrSame( ex, recordedEx ))recordedEx = ex;
<?xml version="1.0" encoding="UTF-8"?><root>
<actions> <action id=“FileAction" class=“fwerrores.actions.FileAction">
<param name="filename" value="fwfile.log" /> </action></actions>
<application> <exception name-pattern="*..Throwable+" thrower="*..*"> <action ref=“FileAction" /> </exception> ...</application>
</root>
Ejecución Ideal
• Incluir la librería fwerrores.jar en el classpath
Ejecución Ideal
• Incluir la librería fwerrores.jar en el classpath
• Listo!
Ejecución Ideal
• Aplicación standalone
– Agregar “–javaagent:<aspectJ>/aspectjweaver.jar”a los parámetros de la JVM al iniciar la aplicación
Ejecución Ideal
• Aplicación Web / “Empresarial”– Tomcat• Modificar context.xml declarando el reemplazo del
classloader principal
– JBoss 6.0• Modificar jboss-scanning.xml indicando que se carguen
primero las clases del ApplicationContext
– WAS• ಠ_ಠ
Classloader? Agent?
• ¿No que AspectJ hace todo automágicamente?– AspectJ se recompila en conjunto con el código Java para
incluir los advices
– Existe la posiblidad de hacer el weaving de aspectos en tiempo de carga de clases, sin recompilar nada
– “-javaagent” permite realizar acciones antes del main (a través de premain)
Classloader? Agent?
• Load-Time Weaving– AspectJ se encarga de agregar un ClassTransformer al
classloader de la aplicación que realiza el weaving
– En Tomcat, el WebAppClassLoader no admite la posibilidad de incluir transformadores de clases
– Es por eso que se extiende el classloader para incluirlos
– Los demás servidores de aplicaciones ya lo permiten (por ejemplo, para JPA)
Pendientes
• Las clases de los JSP se generan en un classloader distinto al de la aplicación
• Los EJB a su vez pueden correr en una aplicación diferente (distinto ClassLoader)
• Habilitar el FW en WAS <= 6 (JDK 1.4)
• Realizar más acciones thread-safe
Gracias! =)