Contrôler vos jobs Alfresco avec JMX (partie 1)

Le concept

Dans mes projets Alfresco, je suis fréquemment amené à mettre en place des batchs réguliers pour effectuer diverses opérations sur le référentiel. En phase de développement/recette, il est souvent utile de pouvoir arrêter, redémarrer, modifier la fréquence du batch pour bien vérifier son fonctionnement.
Traditionnellement, ces opérations nécessitent la modification des propriétés du système ou de beans Spring, et donc le redémarrage d’Alfresco. Cette dernière opération est très coûteuse en temps, on va donc chercher en minimiser le nombre.

C’est dans ce contexte que JMX entre en jeu : nous allons pouvoir ajuster les paramètres de notre job « en direct », sans avoir à redémarrer Alfresco.

Mise en place d’un job

La création de ces batchs est plutôt simple et facile d’accès :

  • une classe pour définir traitement
  • une classe lancer le traitement
  • un trigger pour l’exécution régulière

Tout ceci se configure facilement en Spring :

  • un bean pour le traitement :
    <bean id="jobDemonstration" class="net.torda.alfresco.job.TordaDemonstration"></bean>
  • un bean pour gérer le lancement du traitement :
    <bean id="jobDemonstrationDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
      <property name="jobClass">
        <value>net.torda.alfresco.job.TordaDemonstrationJob</value>
      </property>
      <property name="jobDataAsMap">
        <map>
          <entry key="demo">
            <ref bean="jobDemonstration" />
          </entry>
          <entry key="jobLockService">
            <ref bean="jobLockService" />
          </entry>
        </map>
      </property>
    </bean>
  • un bean pour le trigger :
    <bean id="jobDemonstrationTrigger" class="org.alfresco.util.CronTriggerBean">
      <property name="jobDetail" ref="jobDemonstrationDetail" />
      <property name="scheduler" ref="schedulerFactory" />
      <property name="cronExpression" value="0/10 * * * * ?" />
    </bean>

Il s’agit bien entendu d’un exemple, d’autres peuvent être trouvés dans le fichier scheduled-jobs-context.xml d’Alfresco.
Dans cet exemple, l’idée est de disposer d’un traitement réalisé toutes les 10 secondes. Etant donné les circonstances, le traitement consiste juste à logger le message « Bonne annee 2014 ! ».

Configuration pour l’exposition JMX

L’objectif est ici de pouvoir disposer de notre bean jobDemonstrationTrigger depuis une console de gestion JMX. Spring nous aide particulièrement pour cela puisque chaque bean Spring est automatiquement visible comme MBean JMX. Il suffit juste de les « exporter » au moyen de la configuration suivante :

<bean id="TordaJMXJobs" class="org.springframework.jmx.export.MBeanExporter">
  <property name="server" ref="alfrescoMBeanServer"/>
  <property name="beans">
    <map>
      <entry key="Torda:type=Jobs,name=Job Demonstration Trigger" value-ref="jobDemonstrationTrigger"/>
    </map>
  </property>
</bean>

Dans le détail, on a :

  • Le référencement d’un bean Spring :
    <bean id="TordaJMXJobs" class="org.springframework.jmx.export.MBeanExporter">

    Rien de spécial à ce niveau là; c’est du classique

  • Le rattachement au « serveur JMX » Alfresco :
    <property name="server" ref="alfrescoMBeanServer"/>

    Pour Alfresco 4.2e, les bean Spring « alfrescoMBeanServer » est défini dans le fichier core-services-context.xml.

  • La définition des beans qui doivent être exposés :
    <property name="beans">
      <map>
        <entry key="Torda:type=Jobs,name=Job Demonstration Trigger" value-ref="jobDemonstrationTrigger"/>
      </map>
    </property>

    Ici, un seul bean est défini, mais il pourrait y en avoir plusieurs.

Un redémarrage d’Alfresco plus tard nous permet de passer à l’étape suivante.

Utilisation

Accès à la configuration JMX

Il existe plusieurs outils pour manipuler les MBean JMX. Sur la page du wiki Alfresco dédiée, plusieurs outils sont listés. Pour ma part, j’ai choisi d’utiliser VisualVM.
Avec cette application le rendu est le suivant :

L’onglet MBean permet de voir l’arborescence des MBeans JMX qui ont été définis sur le système. Le nôtre se retrouve dans l’arborescence Torda > Jobs; cette arborescence correspond à ce qui a été configuré comme attribut « key » dans la liste des beans à exporter.
Lorsque l’on sélectionne « Job Demonstration Trigger », 2 onglets principaux sont disponibles :

  • l’onglet « Attributes » :

    Il permet de consulter et définir les valeurs des attributs du trigger.
  • l’onglet « Operations » :

    Il permet d’exécuter les méthodes publiques du bean. On peut voir que certaines méthodes sont assez peu compréhensible, ou s’interroger sur leur utilité dans une console de gestion.

Les autres onglets ne nous servirons pas dans la suite de l’article, mais y jeter un œil n’est pas interdit.

Reconfigurer la fréquence d’exécution du job

La fréquence d’exécution du job est définie au travers de l’expression cron.
Pour modifier cette fréquence, nous pouvons donc réaliser les opérations suivantes :

  1. Changer la valeur de l’attribut « CronExpression » depuis l’onglet « Attributes » :

    Il suffit de cliquer sur la valeur pour entrer en mode édition.
    Nous allons par exemple entrer l’expression 0/5 * * * * ? pour un déclenchement toutes les 5 secondes plutôt que toutes les 10 secondes. On ne le voit pas directement, mais la validation de notre saisie va entraîner l’appel à la méthode setCronExpression du bean (voir le source de la classe CronTriggerBean).
  2. Vérifier que l’expression est bien enregistrée en cliquant sur le bouton « getCronExpression » sur l’onglet « Operations » :
  3. Vérifier que notre job s’exécute maintenant toutes les 5 secondes en vérifiant la log…
    Aïe ! On reste sur une exécution toutes les 10 secondes (je n’ai pas de capture d’écran, mais faites le test).

Le problème provient ici du fait que, même si nous avons bien enregistré la nouvelle expression au niveau du bean, celle-ci n’est pas prise en compte par l’ordonnanceur.
Pour que notre modification soit bien prise en compte, il va falloir exécuter la méthode « afterPropertiesSet » :

A partir de ce moment là, on voit que les logs de notre job de test sont générées toutes les 5 secondes. Parfait ! Nous pouvons maintenant économiser des redémarrages d’Alfresco lors des changements de fréquence d’exécution du job.

Arrêter et redémarrer le job

Toujours dans un contexte de développement, il peut être utile de suspendre l’exécution du job afin de vérifier l’état du système, de générer volontairement des perturbations pour voir comment le système réagit, ou quoi que ce soit d’autre. Là encore, l’exposition JMX que nous avons mise en place va être utile.

Dans l’onglet « Attributs », on voit la présence de l’attribut « Enabled ».

A partir de ce que nous avons vu dans le chapitre précédent, il est naturel de penser que modifier la valeur de cet attribut à « false » et l’exécution de l’opération « afterPropertiesSet » va nous permettre d’atteindre notre objectif.
Que nenni !
La méthode sera bien appelée, mais comme la valeur de « enabled » est maintenant « false », la mise à jour n’aura pas lieue. La log Alfresco nous averti du problème :

La solution consiste ici en une approche radicale : la destruction de l’ordonnanceur via l’opération « destroy » !


Contrairement à ce que pourrait laisser penser son nom, cette méthode ne va pas détruire notre MBean, mais uniquement l’ordonnanceur et sans ordonnanceur, le job ne va plus être exécuté.
Pour le redémarrer, il suffira de repositionner la valeur de « enabled » à « true » puis d’exécuter la méthode « afterPropertiesSet » :

Conclusion de la partie 1

Les principes mentionnés ci-dessus permettent de gagner un temps précieux lors des tests des jobs. Ce sont des principes très simples (uniquement de la configuration Spring), mais leur utilisation est peu évidente. Le « problème » provient de la classe CronTriggerBean que nous avons exposée : elle n’est pas conçue pour ce type d’usage.
Nous verrons donc dans une seconde partie comment améliorer le confort de gestion des jobs en JMX.

En attendant, je vous laisse imaginer et tester l’exposition de vos beans (pas que des jobs !) en JMX ;-)

Cette entrée a été publiée dans Alfresco, avec comme mot(s)-clef(s) , , , . Vous pouvez la mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Protected by WP Anti Spam