¿Es posible en springframework registrar el tiempo empleado por los métodos [selectivo | todo] automáticamente. Por automáticamente quiero decir, no quiero ir a cada método y escribir el log.debug ("...."); cosas.¿Cómo registrar el tiempo empleado por los métodos en Springframework?
Respuesta
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>
Puede usar AspectJ para esto, declarar un punto de corte llamado por wildcard con pre y post manejo mediante los consejos before() y after().
u puede dar algún ejemplo? –
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>
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/
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:
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
- 1. registrar todos los métodos?
- 2. Cómo ajustar springframework @Transactional con AspectJ
- 3. springframework obtener todos los encabezados de solicitud
- 4. ¿Cómo registrar automáticamente la entrada/salida de métodos en Java?
- 5. ¿Cómo clasifico automáticamente los métodos por encabezado?
- 6. pthreads: ¿reúne programáticamente información sobre el tiempo empleado en diferentes estados?
- 7. Registrar programáticamente HttpModules en tiempo de ejecución
- 8. java.lang.NoClassDefFoundError: org/springframework/context/EnvironmentAware
- 9. Registrar el uso de ancho de banda y el tiempo de solicitud en ASP.NET 4.0
- 10. ¿Por qué los métodos "privados" en el objeto orientado?
- 11. BigO tiempo de ejecución en algunos métodos
- 12. ¿Por qué no se permite sobrecargar los métodos dentro de los métodos (por ejemplo, cierres sobrecargados)?
- 13. Unidad de tiempo utilizada en los métodos Apache CXF
- 14. NDesk.Options: cómo registrar los parámetros requeridos correctamente?
- 15. Clasificación por nombre de los métodos presentados en los métodos BCE-búfer
- 16. ¿Cómo registrar la salida en bash y verla en el terminal al mismo tiempo?
- 17. ¿Existe una manera sencilla de registrar los métodos que se invocan sobre un objeto en Ruby?
- 18. ¿Cómo funcionan los métodos asíncronos en C#?
- 19. Cómo registrar el evento document.onkeypress
- 20. Hacer que los métodos de instancia sean privados en tiempo de ejecución
- 21. Registro de Heroku para el empleado de Resque
- 22. ¿Implementando métodos abstractos en tiempo de ejecución?
- 23. ¿Los métodos LINQ son métodos de extensión?
- 24. Complejidad del tiempo de los métodos de HashMap
- 25. ¿Cómo registrar excepciones en appengine?
- 26. ¿Cómo colapsar todos los métodos en XCode?
- 27. Cómo eliminar los métodos actionPerformed en NetBeans
- 28. ¿Cómo puedo documentar los métodos concisamente en el código Perl?
- 29. ¿Cómo manejar el orden de los métodos en Ruby?
- 30. ¿Cómo elimino los métodos de instancia en tiempo de ejecución en Objective-C 2.0?
+1 Parece que esto es lo que estaba pidiendo :). –
realmente bueno. Felicitaciones –
No sé por qué pero no funciona. También edite el código de * * to * * –