lundi 5 janvier 2009

Utiliser les Intercepteurs et l'AOP de Spring pour mesurer les temps de réponses de vos méthodes

J'ai eu une question de la part d'un client qui souhaite mesurer les temps de réponse de certaines méthodes dans une moulinette de calcul d'échéance de prêts bancaire, développé en Java.

Heureusement, le batch exploite le framework Spring.

Le travail devient alors assez simple,

combiner les intercepteurs de Spring et ses capacités AOP (Aspect Programming).



Il s'agit de mesurer, par exemple, les temps de réponses de toutes les méthodes qui réalisent des calculs et qui

commencer par prépare les « outils » de mesure, il s'agit du ben offert par Spring : le PerformanceMonitorInterceptor


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


il s'agit d'un Advice, dans le jargon AOP

Ensuite, associer cet Advice à un pattern particulier : ici toutes les méthodes de type .*calcul.*


<bean id="performanceAdvisor" class=

"org.springframework.aop.support.RegexpMethodPointcutAdvisor">

<property name="advice" ref="performanceInterceptor"/>

<property name="patterns">

<list>

<value>.*calcul*.*value>

list>

property>

bean>

L'étape suivante, consiste en la transformation du bean service en Taget dans l'optique de l'exposer indirectement à travers le ProxyFactoryBean de Spring.


<bean id="calculEcheanceServiceTarget" class="com.netprogress.spring.perf.CalculEcheanceServiceImpl">

<property name="echeanceDao" ref="echeanceDao"/>

bean>


<bean id="echeanceDao"

class="com.netprogress.spring.perf.EcheanceDaoImpl">

bean>









<bean id="calculEcheanceService" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="proxyInterfaces">

<value>com.netprogress.spring.perf.CalculEcheanceServicevalue>

property>

<property name="target">

<ref bean="calculEcheanceServiceTarget"/>

property>

<property name="interceptorNames">

<list>

<value>performanceAdvisorvalue>

list>

property>

bean>


Une fois ce fichier Spring terminé,

vérifier que votre fichier log4j.properties présente la ligne suivante

log4j.logger.org.springframework.aop.interceptor.

PerformanceMonitorInterceptor=TRACE

….


Lancer l'exécution :

[2009-01-05 23:19:44,406] DEBUG : org.springframework.aop.interceptor.PerformanceMonitorInterceptor.

invokeUnderTrace

(PerformanceMonitorInterceptor.java:63) - StopWatch 'com.netprogress.spring.perf.CalculEcheanceService.getCalculEcheance'

: running time (millis) = 16

Ne pas oublier de supprimer cette configuration en production





autre facçon de faire :

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

- <aop:config>
<aop:advisor pointcut="execution(* com.netprogress..*.*(..))" advice-ref="performanceInterceptor" />
</aop:config>


0 commentaires :

Enregistrer un commentaire

Architecte SOA & Professionnel Open Source Headline Animator

 
Khaled BEN DRISS
Cloud Computing, SOA et Web 2.0 : Des sujets techniques sur SOA et l'Open Source : de Java & .Net, PHP5, Symfony, à SaaS / PaaS en passant par Azure, google appengine, le BPM, la Modélisation et d'autres sujets du coté du serveur et cloud computing.