2009-09-30 13 views

Respuesta

17

AOP es lo que necesita aquí. AOP le permite agregar código a su aplicación sin modificar el código original. Spring AOP prefiere lograr esto con Proxy objetos. Los objetos Proxy usan un Patrón Decorador para envolver el objeto original Objetivo y agregar código. El Proxy está configurado para implementar una o más interfaces del objeto original Target.

Aquí, una aplicación para el tiempo, la idea es utilizar el PerformanceMonitorInterceptor, una de las clases de supervisión del rendimiento que se entregan con Spring Framework.

La primera opción es utilizar la clase ProxyFactoryBean de Spring para crear objetos Spring AOP Proxy. Para ello:

  • definir su frijol originales:
  • definir un PerformanceMonitorInterceptor:
  • definir un RegexpMethodPointcutAdvisor:
  • definir un ProxyFactoryBean para aproximar el bean original y aplicar su Asesor
  • Establezca el nivel de registro para PerformanceMonitorInterceptor en TRACE

Por debajo de una configuración de Spring que ilustra estos pasos:

<beans> 
    <bean id="MyServiceTarget" class="org.myapp.services.MyService"> 
    <property ... /> 
    </bean> 

    <bean id="timingLogger" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/> 

    <bean id="timingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
    <property name="advice" ref="timingLogger"/> 
    <property name="patterns"> 
     <list> 
     <value>.*</value> 
     </list> 
    </property> 
    </bean> 

    <bean id="MyService" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyInterfaces"> 
     <value>org.myapp.services.MyService</value> 
    </property> 
    <property name="target"><ref local="MyServiceTarget"/></property> 
    <property name="interceptorNames"> 
     <list> 
     <value>timingAdvisor</value> 
     </list> 
    </property> 
    </bean> 
</beans> 

Y la configuración del nivel de registro para la PerformanceMonitorInterceptor:

log4j.logger.org.springframework.aop.interceptor.PerformanceMonitorInterceptor=TRACE 

Comenzando con Spring 2.0, hay otra opción: utilizando Spring 2.0 XML Schema-based configuration y Spring AspectJ style pointcut expressions. Con el ProxyFactoryBean, debe declarar explícitamente las interfaces que desea proxy; utilizando las etiquetas <aop:config> y <aop:advisor>, puede proxy automáticamente cada interfaz de cada objeto en el contenedor de beans.

<beans "add xsd declarations here" > 
    <bean id="MyService" class="org.myapp.services.MyService"> 
    <property ... /> 
    </bean> 

    <bean id="timingAdvice" 
class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/> 

    <aop:config> 
    <aop:advisor pointcut="execution(* org.myapp.services.MyService.*(..))" 
     advice-ref="timingAdvice"/> 
    </aop:config> 
</beans> 
+0

+1 Parece que esto es lo que estaba pidiendo :). –

+0

realmente bueno. Felicitaciones –

+0

No sé por qué pero no funciona. También edite el código de * * to * * –

1

Puede usar AspectJ para esto, declarar un punto de corte llamado por wildcard con pre y post manejo mediante los consejos before() y after().

+0

u puede dar algún ejemplo? –

2

Finalmente descubrí cómo hacerlo.

Antes que nada vea la publicación por 'Pascal Thivent', me ayudó mucho. Después de cambiar sus log4j.properties y crear timingAdvisor, debe vincular a este asesor a la clase que desea habilitar para la depuración. Tienes que cambiar tu código así.

código anterior:

<bean id="myTableDao" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >     
      <property name="anotherDao" ref="anotherDao"/> 
    </bean> 

nuevo código.

<bean id="myTableDaoTarget" class="com.xyz.sc.db.dao.MyTableDaoImpl" parent="commonDataSource" >     
     <property name="anotherDao" ref="anotherDao"/> 
</bean> 


    <bean id="myTableDao" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="proxyInterfaces"> 
     <value>com.xyz.sc.db.dao.MyTableDao</value> 
    </property> 
    <property name="target"><ref local="myTableDaoTarget"/></property> 
    <property name="interceptorNames"> 
     <list> 
      <value>timingAdvisor</value> 
     </list> 
    </property> 
</bean> 
1

veo que ya ha habido una respuesta aceptada aquí, pero me gustaría animar a todos a echar un vistazo a la última versión de la primavera ToolSuite (distribución de eclipse de SpringSource). Viene con una herramienta de perfilado lista para usar, Spring Insight, que proporciona estas estadísticas exactas en tiempo de ejecución en un formato agradable. Simplemente implemente su aplicación en su tomcat interno, acceda a algunas páginas, luego vaya al servlet/insight y vea el tiempo empleado en cada método hasta llegar a las sentencias SQL que se ejecutaron y cuánto tiempo tomaron.

Aquí hay un enlace a un buen artículo sobre Spring Insight que debería proporcionarle lo que desea en solo unos minutos. http://www.dotkam.com/2009/10/28/spring-insight-in-action-5-minutes-from-scratch/

4

Puede echar un vistazo a stagemonitor. Es un monitor de rendimiento de aplicaciones web Java de código abierto. Captura métricas de tiempo de respuesta, métricas de JVM, detalles de solicitud (incluida una pila de llamadas capturadas por el generador de perfiles de solicitud) y más. La sobrecarga es muy baja.

Opcionalmente, puede usar el gran grafito de base de datos de timeseries con este para almacenar un largo historial de puntos de datos que puede ver con elegantes paneles.

Ejemplo de pantalla: enter image description here

Tome un vistazo a la project website para ver más imágenes, descripciones de las características y documentación.

Nota: Yo soy el programador de stagemonitor

Cuestiones relacionadas